begin process at 2010 02 09 16:58:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > AFFICHAGE DE RÉSULTATS MYSQL SUR PLUSIEURS PAGES

AFFICHAGE DE RÉSULTATS MYSQL SUR PLUSIEURS PAGES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Initié Date de création :19/07/2004 Vu :7 579

Auteur : eax

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
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


 Sources du même auteur

QUI EST ONLINE?
CALCULER LA TAILLE D'UN DOSSIER
Source avec Zip CODES POSTAUX LOL
ÉVITER LA DÉFORMATION D'UN TABLEAU HTML EN DÉCOUPANT UNE CHA...
Source avec Zip ÉPHÉMÉRIDE

 Sources de la même categorie

Source avec une capture PAGINATION EN PHP par Orangina
Source avec Zip POO - DEBUGGER par DiGhan
Source avec Zip CRAWLER DE SITE EN PHP par Mcjo
DÉCOUPAGE D'UN TEXTE EN FONCTION DES SAUTS DE LIGNES par biloubil
RÉCUPÉRER LE CHEMIN RELATIF D'UN OBJET PAR RAPPORT À LA RACI... par FredPsy

Commentaires et avis

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 !

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 +

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

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)

Commentaire de Anthomicro le 21/07/2004 20:15:19

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

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;)

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 ;-)

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);

Commentaire de eax le 27/01/2007 16:22:02

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

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

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

Commentaire de romualb le 28/09/2009 11:41:30

j'ai développé une classe qui affiche une liste à partir du résultat d'une requête SQL, avec tri, pagination...
http://www.romualb.com/2009/09/27/144/classe_d_affichage_de_listes.html

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales