PAGINATION TRÈS SIMPLE SANS TABLEAU

cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009 - 28 juin 2006 à 17:16
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 3 juil. 2006 à 12:27
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38349-pagination-tres-simple-sans-tableau

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 juil. 2006 à 12:27
RAKIZM, tu n'as qu'a décaler les id quand tu supprimes un article...
rakizm Messages postés 80 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 16 février 2008
3 juil. 2006 à 09:20
tu veux dire utiliser where comme ça :
select id from table where id between $d,$f ;

le pb c ke les id ne sont pas num auto-increment auquel cas limit sera meilleur
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 juin 2006 à 15:24
et bien, quand tu fais limit, mysql séléctionne tout les champs de la table, et ne renvoi que les premiers, le temps de calcul est considérable... pour du where, mysql ne séléctionne qu'une partie des lignes : uniquement les bonnes... ce qui rend la requette beaucoup plus rapide...

essai avec EXPLAIN par exemple...
rakizm Messages postés 80 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 16 février 2008
30 juin 2006 à 15:17
coucou qu'est ce que tu racontes??? j'ai pas bien saisi l'histoire du where et limit
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 juin 2006 à 15:11
avec un limit; il parcours toute la table, avec un where, il n'en parcours qu'une partie...
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
30 juin 2006 à 14:47
ca marche car tu fais un test sur l'existence du resultat, cependant tu boucles dans tous les cas 15 fois, meme si tu n'as que 5 resultat a affiche ( perte de temps et de ressources => pour moi c'est optimisable)

le foreach te permettra de boucle le nombre de fois qu'il y a de reponse pas de trop ni pas assez
le while c'est pareil ( apres il faut faire des bench pour savoir lequel a le plus rapide), c'est 2 structures de prog sont les plus adaptés a mon sens.


tu fais comme tu le sent. soit tu en affiches 10 par 10 et le suivant => page suivante
1->10 <- précedent
11->20 -> si tu es ici
21->30 -> suivant

ou alors tu affiches le 1er numero de page, le dernier numero de page et x page à droite et a gauche de la position courante

Ca c'est vraiment a ton apréciation
rakizm Messages postés 80 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 16 février 2008
30 juin 2006 à 14:01
garfield je t'assure comme ça ça marche meme pour la dernière page ou il ya que 5 enreg :)
mais il y a plein d'autres chose à faire ex: tu me dis il faut afficher les n°de page à atteindre mais j'en 465 il faut ke j'affiche les 465 liens????
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
30 juin 2006 à 13:55
@Rakizm :

si tu fais :
$f = $d + $nb

tu iras de 1 à 16 => 16 resultats et non 15 comme voulu, peut etre que je me plante dans les index.

Utilises pas une boucle for dans un cas comme ca car tu n'as pas forcement 15 réponses.
A la limite, utilise un foreach ou un while ( avec comme condition $nb affichage fait OU plus de réponse)

quant au limit, je suis oki avec toi coucou747 car c'est une spécif MySQL et non pas SQL.
pour la rapidité, j'ai jamais bencher ca.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 juin 2006 à 12:12
limit n'est pas à utiliser pour ce genre de chose, beetwen est bien plus rapide...
arrétez ces <? et ces fermetures de tags trop violentes... c'est crade comme méhode... utilisez <?php et echo à la place
rakizm Messages postés 80 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 16 février 2008
30 juin 2006 à 10:46
re tout le monde pour ceux qui ne l'aurai pas remarqué l'affichage est faut pour afficher 15 lignes par page il faut utiliser une boucle for et non un while
donc ce ki donne :

for ($i=1;$i<=15;$i++)
{
if ($res= dbi_fetch ($temp1,"row",$db_driver))//dbi_fetch à remplacer par mysql_fetch_array ou row
{?>
<? echo $res[0];?>


<? }
}


par contre garfield merci pour la petite formule elle est juste à peu de chose prés "$f $d + $nb - 1"> $f=$d+$nb;


j'ai changé les noms des variables
rakizm Messages postés 80 Date d'inscription lundi 19 juin 2006 Statut Membre Dernière intervention 16 février 2008
29 juin 2006 à 17:05
Merci à tous de contribuer à l'amélioration de ce code je vous ferai part des améliorations faites

:)
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
29 juin 2006 à 12:10
@Phalleas_44 : dans ce cas tu te prends la tete pour rien ( et pourquoi pas, utilisez une expression rationnelle ).

1 simple transtypage suffit :
$p = isset($_GET['p']) ? (int) $_GET['p'] : 1 ; // test l'existence de $_GET['p']
if ( $_GET['p'] === 0 ) $p=1 ;

Je trouve son systeme de pagination bizarre.

si tu es a la page 2, son systeme fait

# $p= 2;
# $d=($p+15)-2;//début d'affichage si la page!==1 => $d = 15
# $f=$d+15;//fin d'affichage dans ce cas 15 affichage par page => $f = 30
# $limit $d.",".$f;> $limit = 15,30

ici tout marche nickel, maintenant allons en page 5

# $p= 5;
# $d=($p+15)-2;//début d'affichage si la page!==1 => $d = 18
# $f=$d+15;//fin d'affichage dans ce cas 15 affichage par page => $f = 33
# $limit $d.",".$f;> $limit = 18,33

ca me semble erronée.

perso, je ferai plus un truc du genre
# $nb = 15 // nbre d'info par page
# $d = (($p-1)*$nb) + 1 ;
# $f = $d + $nb - 1
# $limit $d.','.$f
> pour la page 1, $limit = 1,15
> pour la page 2, $limit 16,30
> pour la page 3, $limit 31,45

je pense pas avoir fait d'erreur

En plus d'être très mal codé, ca ne donne pas le résultat que j'excompte pour un système de pagination
Palleas_44 Messages postés 130 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 avril 2009
29 juin 2006 à 11:36
ouep, rien de ce qui provient de la machine du visisteur n'est fiable, test avant, controle la structure avec sprintf() par exemple etc...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 juin 2006 à 09:09
Hello,

à modifier stp.
Je regarderai à mon retour, dans 5 jours.
Mais il y a pas mal de points à revoir, pour que les grands débutants ne voient pas de vilaines habitudes de programmation.

Je rajoute juste, rapidement, à ce qu'a dit Garfield : tu utilises un $_GET directement sans tester son existence. Pas bien.
stepibou Messages postés 112 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 11 octobre 2006
29 juin 2006 à 00:03
# else
# $d=($p+15)-2;
=>
# else if (isnumeric($p))
# $d=($p+15)-2;
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
28 juin 2006 à 17:16
Juste histoire de critiquer, j'ai que ca a faire ;)

bon, un systeme de pagination n'a rien a faire de ton systeme de présentation ( tableau ou paragraphe) => titre mal formulé.

De plus, à la lecture, ton code ne permet que le suivant et/ou le précédent
- ca serait pas mal de donner la possibilité d'aller sur la page X sans faire toutes les pages intermédiaires
- Tu affiches dans tous les cas Precédent ou Suivant qui sont cliquable (avec ou sans effet) ca peut etre amélioré
- Tu devrais donner la possibilité a l'utilisateur de gérer le nombre de 'ligne' par page
- Tu devrais la transformer en fonction
- En lecture, tes variables $p,$f,$d sont incompréhensible au premier coup d'oeil ( on sait pas a quoi elle servent )
- Tu fais 2 requetes quasiment identique, un troncature du tableau de resultat de ta requete serait peut etre mieux (fonction array_slice)
- Tu ouvres et fermes tes balises bcp trop souvent, lecture difficile
- Utilisation de <? en place de <?php
=> code moins portable mais qui marche pour toi ( pas forcement pour tout le monde )
- Tu n'affiches pas le nombre de page donc on sait pas ou on est

En gros, pour moi c'est un source qui est inutile, plein d'erreur

Je crois que c'est a peu pres tout ce qu'il y a dire dessus
Rejoignez-nous