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

Signaler
Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
16 juillet 2009
-
Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
16 juillet 2009
-
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

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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...
Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
16 juillet 2009

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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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...
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
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.
Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
16 juillet 2009

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.