Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AFFICHAGE DE RÉSULTATS MYSQL SUR PLUSIEURS PAGES


Information sur la source

Catégorie :Astuces Niveau : Initié Date de création : 19/07/2004 Vu : 6 476

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

bon voilà, demandé par cercleaventure sur le forum, une fonction qui gère l'affichage des liens "page suivante", "précédente", ... pour couper l'affichage du résultat d'une grosse requete
voici un petit exemple pour montrer ma fonction dans ce contexte:
 

Source

  • function gestion_pages($d,$l,$lien,$nb_total){
  • //$d: premier enregistrement affiché
  • //$l: nombre d'enregistrements affichés par page
  • //$lien: lien utilisé pour la page actuelle (attention les parametes $d et $l ne doivent pas etre utilisés)
  • //$nb_total: nombre total d'enregistrements
  • echo '<table width="100%" cellspacing="0" cellpadding="2" border="0"><tr><td width="33%" nowrap align="left" valign
  • ="bottom">';
  • $debut=$d-$l;
  • if(substr_count($lien,'?')==0)
  • $lien.='?';
  • else
  • $lien.='&';
  • if($debut<0) $debut=0;
  • if($d>0){
  • echo '<a href="'.$lien.'d=0&l='.$l.'">Premi&egrave;re page</a>, ';
  • echo '<a href="'.$lien.'d='.$debut.'&l='.$l.'">Page pr&eacute;c&eacute;dente</a>';
  • }
  • echo '</td><td width="33%" nowrap align="center" valign="bottom">';
  • echo ceil($nb_total/$l)-ceil(($nb_total-$d)/$l)+1; //affiche le numéro de la page courante
  • echo '/';
  • echo ceil($nb_total/$l); //affiche le nb total de pages
  • echo '</td><td width="33%" nowrap align="right" valign="bottom">';
  • $suiv=$d+$l;
  • if($d+$l<$nb_total){
  • echo '<a href="'.$lien.'d='.$suiv.'&l='.$l.'">Page suivante</a>, ';
  • echo '<a href="'.$lien.'d='.($nb_total-$l).'&l='.$l.'">Derni&egrave;re page</a>';
  • }
  • echo '</td></tr></table>';
  • }
  • if(!isset($_GET[l])) $_GET[l]=20; //pour avoir que 20 enregistrements par page par exemple
  • if(!isset($_GET[d])) $_GET[d]=0; //on affiche en premier l'enregistrement 0 (le premier) par défaut
  • $req=mysql_query("select * from messages limit $_GET[d], $_GET[l];"); //ça c'est la requete de base pour sélectionner ce
  • qu'on va afficher sur la page
  • $nb_total=mysql_num_rows(mysql_query("select * from messages;")); //cette requete sert à compter le nombre d'enregistrement
  • total (pour connaitre le nombre de pages au total)
  • //$req va contenir tous les enregistrement à afficher
  • //libre à vous d'en faire ce que vous voulez ici
  • //un for pour les afficher, ...
  • //c'est ici que vous gérez votre affichage des résultats
  • //et en bas, on appelle ma fonction pour afficher les liens suivant la page ou on se trouve
  • gestion_pages($_GET[d],$_GET[l],$_SERVER['REQUEST_URI'],$nb_total);
function gestion_pages($d,$l,$lien,$nb_total){
	//$d:		premier enregistrement affiché
	//$l:		nombre d'enregistrements affichés par page
	//$lien:	lien utilisé pour la page actuelle (attention les parametes $d et $l ne doivent pas etre utilisés)
	//$nb_total:	nombre total d'enregistrements

	echo '<table width="100%" cellspacing="0" cellpadding="2" border="0"><tr><td width="33%" nowrap align="left" valign

="bottom">';
	$debut=$d-$l;
	if(substr_count($lien,'?')==0)
		$lien.='?';
	else
		$lien.='&';
	if($debut<0) $debut=0;
	if($d>0){
		echo '<a href="'.$lien.'d=0&l='.$l.'">Premi&egrave;re page</a>, ';
		echo '<a href="'.$lien.'d='.$debut.'&l='.$l.'">Page pr&eacute;c&eacute;dente</a>';
	}
	echo '</td><td width="33%" nowrap align="center" valign="bottom">';
	echo ceil($nb_total/$l)-ceil(($nb_total-$d)/$l)+1; //affiche le numéro de la page courante
	echo '/';
	echo ceil($nb_total/$l); //affiche le nb total de pages
	echo '</td><td width="33%" nowrap align="right" valign="bottom">';
	$suiv=$d+$l;
	if($d+$l<$nb_total){
		echo '<a href="'.$lien.'d='.$suiv.'&l='.$l.'">Page suivante</a>, ';
		echo '<a href="'.$lien.'d='.($nb_total-$l).'&l='.$l.'">Derni&egrave;re page</a>';
	}
	echo '</td></tr></table>';
}



if(!isset($_GET[l])) $_GET[l]=20; //pour avoir que 20 enregistrements par page par exemple
if(!isset($_GET[d])) $_GET[d]=0;  //on affiche en premier l'enregistrement 0 (le premier) par défaut

$req=mysql_query("select * from messages limit $_GET[d], $_GET[l];"); //ça c'est la requete de base pour sélectionner ce 

qu'on va afficher sur la page

$nb_total=mysql_num_rows(mysql_query("select * from messages;")); //cette requete sert à compter le nombre d'enregistrement 

total (pour connaitre le nombre de pages au total)

//$req va contenir tous les enregistrement à afficher
//libre à vous d'en faire ce que vous voulez ici
//un for pour les afficher, ...
//c'est ici que vous gérez votre affichage des résultats

//et en bas, on appelle ma fonction pour afficher les liens suivant la page ou on se trouve

gestion_pages($_GET[d],$_GET[l],$_SERVER['REQUEST_URI'],$nb_total);

Conclusion

voilà, n'hésitez pas à me poser des questions :p
 

Commentaires et avis

signaler à un administrateur
Commentaire de GRenard le 19/07/2004 09:21:22

Tu devrais essayer de ne pas passer une variable superglobale dans la fonction puisque dans celle ci tu peux y accèder dans la fonction directement...
Je comprends que tu fais cela parce que tu veux garder tes paramètres passé en _GET
Alors encore mieux et plus amusant à faire (mouarf je l'ai fait mais je vais te laisser chercher vu que tu m'as l'air un bon petit codeur ;))
C'est de ne pas passer le lien du tout ni le mettre dans le a href, mais de commencer directement le lien par
?d= (par exemple) et de rajouter à la fin &".$query."

$query pouvant être $_SERVER['QUERY_STRING'] SANS les variables $d et et $l bien sur (ya un peu de ereg à faire la dedans ;))

2ieme critique
Normalement, une fonction, permet soit d'alléger le code ou l'on est présentement, (genre appeler une fonction qui va afficher beaucoup de chose (avec echo)), ou encore, ca sert au lieu de se répeter 50 fois, et l'autre c'est d'afficher un module...
Ta fonction devrait etre un "module" qui devrait fonctionner sur n'importe quel site. Le seul problème c'est que tu fais pleins de echo de tableau... Moi si je veux ta fonction je dois enlever ces echo et ne garder que les echo des links... (ou encore mieux, faire un return ...)
Donc en fait ce que je te propose de faire, c'est de faire la fonction le plus modulaire possible pour que n'importe qui puisse prendre la fonction avec directement copier coller sans rien modifier à l'intérieur !
(Ca c'est trop fort quand ca arrive :P)

3ieme critique,
je vois que tu es quand même avancé en php, tu pourrais commencer à te fier aux standards... ceux de php on dirait que tu les maitrises alors pourquoi ne pas essayer ceux des commentaires de fonction ;)
/**
* @return void
* @param int $l
* @desc Une petite description
*/


Bonne Chance !

signaler à un administrateur
Commentaire de Anthomicro le 20/07/2004 18:10:55

"je vois que tu es quand même avancé en php, tu pourrais commencer à te fier aux standards... ceux de php on dirait que tu les maitrises alors pourquoi ne pas essayer ceux des commentaires de fonction"

et XHTML par la même occasion ;-) (par exemple le & dans les urls il faut le remplacer par &amp;

a +

signaler à un administrateur
Commentaire de derfum le 21/07/2004 11:54:51

On veut jouer les lourds sur les standards ? ^_^ alors :

* cellspacing="0" cellpadding="2" border="0"
* align="center" valign="bottom"
--> Deprecié : préférez les feuilles de style

* nowrap
--> Erreur ! remplacer par nowrap="nowrap" (les raccourcis sont interdits en xhtml, comme selected, checked, disable, ismap, nowrap...)

FReD

signaler à un administrateur
Commentaire de GRenard le 21/07/2004 19:02:30

Je ne suis pas encore assez xhtml, je devrais m'y mettre bientot lorsque j'airai du temps ! mais c'est quelque chose que je dois apprendre :) Si tu connais une place ou tous les standards sont bien écrit et pas perdu dans la masse je suis prèt à tout lire :) (j'espere qu'il y a autre chose que wc3 :P)

signaler à un administrateur
Commentaire de Anthomicro le 21/07/2004 20:15:19

oui il y a www.openweb.eu.org qui est pas mal ;-)

signaler à un administrateur
Commentaire de derfum le 21/07/2004 21:01:17

En réponse à GRenard :

En bon citoyen, j'indique quand même en premier lien une traduction officielle du W3C (malgré tout compréhensible) :  http://www.la-grange.net/w3c/xhtml1/
Pour ce qui est des standards du web, voilà un site référence à posséder dans tous bons favoris (ou signets, ou marques-pages...) : http://www.openweb.eu.org (et c'est en français)
Et plus particulièrement voilà 4 articles à lire :
http://www.openweb.eu.org/articles/html_au_xhtml/
http://www.openweb.eu.org/articles/differentes_dtd/
http://www.openweb.eu.org/articles/respecter_semantique/
http://www.openweb.eu.org/articles/caracteres_illegaux/

Ceci permettra d'approfondir; mais en quelques mots voilà ce qu'il faut retenir du XHTML :
- Les déclarations de documents sont importants
- Le XHTML (n'étant qu'une DTD du XML) est avant tout un langage sémantique, c'est-à-dire d'organisation de concepts, pas de présentation (comme l'était HTML 3.2/4.0). Il faut donc séparer le fond de la forme, c'est pour ça que tous les outils de présentation (balises font, center, u, i, b, s ; attributs align, cell*...) sont dépréciés (et même illégale pour le XHTML strict) et à remplacer par du CSS. De plus, les balises peu utilisées en HTML (blockquote, dd, dt, strong, em) ne sont pas juste des alias de pre, ul, li, b, i mais bien porteuses d'un concept diffèrent à utiliser à bon escient.
- L'emboîtement correct des balises est exigé
- Toutes les balises se ferment (même <p></p>, <br />, <img />...)
- Les URLs sont encodées (&amp;)

signaler à un administrateur
Commentaire de aminix9 le 29/07/2004 12:50:20

je n ai pa de commentaire mais je tiens à te remercier car ça m a aidé bcp .
j ai pris ta fonction et j ai rempli les champs vides et ça marche .
merci  encore une fois ;-)

signaler à un administrateur
Commentaire de truemistress le 27/01/2007 12:21:04

Merci pour ce code très utile.

Par contre, en tenant compte -entre autre- des commentaires postés, je l'ai simplifié et optimisé :
- en remplaçant les '&' par '&amp;'
- en remplaçant les 'nowrap' par 'nowrap="nowrap"'
- en supprimant $lien, par ex : <a href="'.$lien.'d=0&l='.$l.'"> par <a href="?d=0&amp;l='.$l.'"> (cela permet d'avoir une URL qui ne se rallonge pas à chaque action, elle reste constamment du type '?d=xx&l=xx')
- en remplaçant les 'echo' par '&html.= ', ce qui permet de faire un 'return $html;' à la fin de fonction, pour que quand on appelle la fonction ça affiche directement les éléments de navigation, dans n'importe quelle page.
- j'ai remplacé les textes "page suivante", "dernière page" etc.. par des images standards (left_on.gif=une flèche vers la gauche pour le lien "précédente" et 2 flèches vers la gauche pour le lien "première" ; idem avec des fleches vers la droite pour "suivante" et "dernière", avec les textes alternatifs correpondants.
- j'ai rajouté $d = $_GET['d'];

Du coup, cette fonction peut etre copiée et appliquée n'importe où (en changeant juste le nom des images : 'right.on.gif' et 'left_on.gif').

Voici donc la fonction allégée et optimisée que je propose :


function gestion_pages($d,$l,$nb_total){
//$d: premier enregistrement affiché
//$l: nombre d'enregistrements affichés par page
//$nb_total: nombre total d'enregistrements  

    $html.= '<table width="180px" cellspacing="0" cellpadding="2" border="0" class="mini" align="center"><tr><td width="33%" nowrap="nowrap" align="left" valign="bottom">';
$debut=$d-$l;
if($debut<0) $debut=0;  
if($d>0)
    {
$html.= '<a href="?d=0&amp;l='.$l.'" alt="premi&egrave;re page" title="premi&egrave;re page"><img src="images/left_on.gif" width="9" height="16" hspace="0" border="0" /><img src="images/left_on.gif" width="9" height="16" hspace="0" border="0" /></a> ';
$html.= '<a href="?d='.$debut.'&amp;l='.$l.'"><img src="images/left_on.gif" width="9" height="16" hspace="10" alt="page pr&eacute;c&eacute;dente" title="page pr&eacute;c&eacute;dente" border="0" /></a>';
}
$html.= '</td><td width="33%" nowrap="nowrap" align="center" valign="middle">page ';
$html.= ceil($nb_total/$l)-ceil(($nb_total-$d)/$l)+1; //affiche le numéro de la page courante
$html.= '/';
$html.= ceil($nb_total/$l); //affiche le nb total de pages
$html.= '</td><td width="33%" nowrap="nowrap" align="right" valign="bottom">';
$suiv=$d+$l;
  
if($d+$l<$nb_total)
    {
$html.= '<a href="?d='.$suiv.'&amp;l='.$l.'"><img src="images/right_on.gif" width="9" height="16" hspace="10" alt="page suivante" title="page suivante" border="0" /></a> ';
$html.= '<a href="?d='.($nb_total-$l).'&amp;l='.$l.'" alt="derni&egrave;re page" title="derni&egrave;re page"><img src="images/right_on.gif" width="9" height="16" hspace="0" border="0" /><img src="images/right_on.gif" width="9" height="16" hspace="0" border="0" /></a>';
}
$html.= '</td></tr></table>';
    return $html;
}

//on rajoute ces infos avant sa requete
$d = $_GET['d'];
if(!isset($_GET['l'])) $_GET['l']=4; //pour avoir que 4 enregistrements par page par exemple
if(!isset($_GET['d'])) $_GET['d']=0;  //on affiche en premier l'enregistrement 0 (le premier) par défaut  

// la requete :
$results = $db->dbQuery("SELECT * FROM nomtable LIMIT ".$_GET['d'].",".$_GET['l']." ");

//appel de la fonction :
$barrenavig = gestion_pages($_GET['d'],$_GET['l'],$nb_total);

signaler à un administrateur
Commentaire de eax le 27/01/2007 16:22:02

oui, c vrai que ça le rend un peu plus propre, merci ...

signaler à un administrateur
Commentaire de guss le 15/05/2007 16:04:43

Bonjour,

Merci pour le code et son optimisation.
J'ai changé une ligne dans le code optimisé de Truemistress.

$html.= ceil($d/$l)+1;//affiche le numéro de la page courante

à la place de :
$html.= ceil($nb_total/$l)-ceil(($nb_total-$d)/$l)+1; //affiche le numéro de la page courante

Bonne Journée
Guss

signaler à un administrateur
Commentaire de jimmywydadi le 01/10/2007 15:54:46

bonjour
je voudrais un code premet de faire (Précé   [   1   2   3   4   5   6   7   8   9   ]    Suiv)
d'une seul page web

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,811 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.