Pagination d'une requête 109 ligne sur pages de 20 lignes

ragmo Messages postés 10 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 16 juillet 2009 - 16 oct. 2008 à 11:42
ragmo Messages postés 10 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 16 juillet 2009 - 19 nov. 2008 à 18:14
Bonjour,

Je voulais savoir comment on pouvait gérer la pagination des nombres de lignes ramenées par une requête (Base MySQL) pour n'afficher que 20 lignes par page (en PHP), et qu'en bas de la page on a l'accès aux autres pages 1, , 34, 5, ..  >> (si l'on est sur la première page).

Je sais que que le nombre de mes pages est le rapport (Nbr lignes résaltant de la requête / 20) +1 si le reste est différent 0. Mais problème se situe dans l'appel de la page appelée, comment faire en sorte que les données des lignes 21 à 40 s'affichent quand j'appelle la page 2.

Cordialement.

5 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2008 à 12:04
Salut,

La lecture de la doc pourrait s'avérer utile, avant de poser ce genre de question.

http://dev.mysql.com/doc/refman/5.0/fr/select.html

<li>
La clause
LIMIT
peut être utilisée pour
limiter le nombre d'enregistrements retournés par la
commande
SELECT
.
LIMIT

accepte un ou deux arguments numériques. Ces arguments
doivent être des entiers constants.



Avec un argument, la valeur spécifie le nombre de lignes à
retourner depuis le début du jeu de résultat. Si deux
arguments sont donnés, le premier indique le décalage du
premier enregistrement à retourner, le second donne le
nombre maximum d'enregistrement à retourner. Le décalage
du premier enregistrement est 0 (pas 1) :



Pour être compatible avec PostgreSQL, MySQL supporte aussi
la syntaxe :
LIMIT row_count OFFSET
            offset
.


mysql>
SELECT * FROM table LIMIT 5,10;  # Retourne les enregistrements 6 à 15



Pour obtenir tous les enregistrement d'un certain décalage
jusqu'à la fin du résultat, vous pouvez utiliser de grands
entier en tant que second paramètre :


mysql>
SELECT * FROM table LIMIT 95,18446744073709551615; # Retourne les enregistrements de 96 jusqu'au dernier.



Si un seul argument est donné, il indique le nombre maximum
d'enregistrements à retourner :


mysql>
SELECT * FROM table LIMIT 5;     # Retourne les 5 premiers enregistrements



Autrement dit,
LIMIT n
est équivalent à
LIMIT 0,n
.


</li>

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
ragmo Messages postés 10 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 16 juillet 2009
16 oct. 2008 à 12:36
Merci Neige,

Donc, si j'ai bien compris, à chaque fois que je dois afficher une page je relance une nouvelle requête ? Cela me paraîtrait un peu lourd.
Donc au total, j'aurai ma première requête pour compter le nombre de lignes concernées, puis je fais une deuxième requête pour ramener la première page les lignes de 1 à 20 si cette page est demandée, ensuite quand je clique sur le lien pointant sur la page 2 je relance ma requête encore une nouvelle pour ramener les lignes de 21 à 40, et ainsi de suite jusqu'à la limite de mes nombre de lignes ??

Cela peut marcher, mais je me demande s'il n'y a pas un moyen me permettant d'économiser les entrée/sortie à la base tel que le rafraîchissment des données préalablement stockées dans un tableau par exemple.

Cordialement
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2008 à 13:05
Si, c'est possible, il faudrait pour cela mettre le résultat de la requête en cache. La GRANDE question est : comment le mettre en cache... Et c'est là qu'on se rend compte que finalement, refaire la requête, c'est pas plus lourd que de mettre en cache, lire, parcourir jusqu'au premier enregistrement à prendre...

Si la table est correctement indexée, ça ne posera pas de problème particulier...

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
16 oct. 2008 à 17:22
Bonjour,

Tu n'es pas obligé d'éxécuter plusieurs fois ta requête.
Regarde du coté de la fonction FOUND_ROWS() (http://dev.mysql.com/doc/refman/5.0/fr/information-functions.html)

Ordinastie.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ragmo Messages postés 10 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 16 juillet 2009
19 nov. 2008 à 18:14
Je te remercie Ordinastie de ton apport technique avancé, je remercie Neige aussi. J'ai maintenant assez de billes pour avancer dans ma problématique.
De mon côté j'ai pu trouver ces deux liens intéressants
http://www.webmaster-hub.com/index.php?showtopic=23788#entry166488
et
http://www.webmaster-hub.com/lofiversion/index.php/t26572.html

Cordialement.
0
Rejoignez-nous