Affichage dynamique des resultats d'une requete mysql sur plusieurs pages

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 552 fois - Téléchargée 32 fois

Contenu du snippet

Ce script permet un affichage dynamique des resultats d'une requête sur plusieurs pages avec les liens vers les autres pages ainsi qu'un lien pg suivante et pg précédente. On choisit le nb de resultats affichés par page

Source / Exemple :


<?php
//(C) Grapsus: grapsus@hotmail.com
//c'est un morceau de code, c'est pour cette raison qu'il n'y a pas de balises html
//ce script est totalement libre, vous pouvez en faire ce que vous voulez ;-)
// /!\ pour que ca marche register_globals doit etre à "on" dans php.ini

//$pg est la variable qui indique sur quelle page se trouve l'utilisateur
//si par exemple vous affichez 10 resultats par page et que $pg=2, on affciche
//les resultats de 11 à 20...
//sur la page 3, de 21 à 30... etc

//on verifie si la variable $pg est definie, sinon on l'initialise a 1
if(!isset($_GET['pg'])){
	$pg = 1;
}else{
	$pg = $_GET['pg'];
}

//on verifie si la variable qui est censcée etre un numero de page est bien un chiffre,
//cela evite qu'un gogole vous pirate avec une injection mysql
if(!is_numeric($pg)){
	$pg = 1;
}

//connexion mysql
$link = mysql_connect("localhost", "root", "")or die("Erreur de connexion: ".mysql_error($link));
//chois d'une bdd
mysql_select_db("test", $link)or die("Erreur de connexion: ".mysql_error($link));

//c'est le nb d'enregstrements à affiche par page:
$enreg_par_pg = 10;

//fonction qui affiche les liens vers les autres pages, ainsi que les liens page suivante et page precedente:
function pgs($enreg_par_pg, $pg, $link){
//c'est la requete qui doit permettre le nombre de résultats total qui va etre reparti sur plusieurs pages
	$res = mysql_query("SELECT * FROM table", $link)or die("Erreur MySQL: ".mysql_error($link));
	$nb_enreg = mysql_num_rows($res);
	//on calcule le nb de pages
	$nb_pg_rounded = ceil( $nb_enreg / $enreg_par_pg );	
	//numero de page precedente
	$pp = $pg - 1;
	//numero de la page suivante
	$ps = $pg + 1;
	
	//si l'utilisateur se se trouve pas a la page n°1
	if($pg != 1){
		//on affiche un lien page précedente
		//si votre script a besoin d'autre variable pour fonctionner n'oublier pas des les transmettre en ajoutant &var=$var...
		echo "<a href='?pg=$pp'><<page précédente</a>";
	}
	
	//definition d'une variable pour la boucle
	$i=1;
	
	//la syntaxe do...while permet d'effectuer la boucle au moins une fois!
	do{
		//si $i n'est pas egal au numero de la page sur laquelle se trouve l'utilisateur...
		if($i != $pg){
			//...on affiche un lien vers cette page
			//idem: si votre script a besoin d'autre variable pour fonctionner n'oublier pas des les transmettre en ajoutant &var=$var...
			echo "&nbsp;<a href='?pg=$i'>$i</a>\n";
		}else{
			//...sinon on affiche simplement le n°  de la page actuelle
			echo "&nbsp;$i&nbsp;";
		}
	//incrémentation de la viariable de la boucle
	$i++;
	//on recommence tant que $i n'atteint pas le numero de la derniere page
	}while($i <= $nb_pg_rounded);
	
	//si l'utilisateur n'est pas a la derniere page...
	if($pg != $nb_pg_rounded){
		//...on affiche un lien page suivante
		//idem: si votre script a besoin d'autre variable pour fonctionner n'oublier pas des les transmettre en ajoutant &var=$var...
		echo "&nbsp;<a href='?pg=$ps'>page suivante>></a>";
	}
}

//ici on calcule à partir de quel enregistrement il faut afficher $enreg_par_pg résultats
$limit = $enreg_par_pg*$pg-$enreg_par_pg;

//c'est la requete qui selectione $enreg_par_pg resultats
$req = mysql_query("SELECT * FROM table LIMIT $limit, $enreg_par_pg")or die("Erreur MySQL: ".mysql_error($link));

//
//ici c le code qui affiche les resulatats de votre requete, tout depend du script
//par exemple:
//while($tab = mysql_fetch_assoc($req)){
//echo $tab["champ"];
//echo "<br>";
//}

//on appele la fonction précédament créée pour afficher les liens vers les autres pages, vous pouvez l'appeler plusieurs fois s'il le faut
echo "<br>";
pgs($enreg_par_pg, $pg, $link);
?>

Conclusion :


Voila j'ai essayé de faire ce bout de code le plus complet possible, si vous avez des remarques, dites le. Et lisez bien les commentaires

A voir également

Ajouter un commentaire

Commentaires

cs_seyev
Messages postés
93
Date d'inscription
samedi 9 juin 2001
Statut
Membre
Dernière intervention
6 mai 2005
1 -
Hum bien, mais tu peux remplacer
$nb_pg = $nb_enreg/$enreg_par_pg;
//si la division ne tombe pas juste (modulo non nul)
if ($nb_enreg%$enreg_par_pg != 0){
//alors on fait un arrondi à l'unité par excès
$nb_pg_rounded = floor($nb_pg) + 1;
}else{
//et si la division tombe juste (modulo nul) on garde le resultat de la division
$nb_pg_rounded = $nb_pg;
}

par
ceil( $nb_enreg / $enreg_par_pg );
la fonction ceil renvoie la plus petit entier supérieur ou égal à son paramètre (de type float)

sinon, c'est sympa...

la
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
if(!is_numeric($pg)){
exit();
}

j'aurais mis $pg = 0; (pour la première page, à moins que ce ne soit 1, enfin bref), ça a le même effet de zapper les injections, mais au moins ça affiche une page convenable.

sinon, ton script est limité à des PHP qui ont l'autoglobal (ce qui en soi est horriblement malsain ^^). pense à passer à l'écriture $_GET['pg'], parce que c'est une chose de se protéger des injections, c'en est une autre de se trimbaler avec les auto globals :/
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
j'oublais: pq c'est ds initié ?
cs_alexlord
Messages postés
8
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
15 février 2006
-
Ok je vais prendre en compte vos remarques. Vous me dmenadez pk c ds initiés? Vous le vpyez plustôt dans les débutants?
cs_alexlord
Messages postés
8
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
15 février 2006
-
Vous avez tt a fait raison pour le ceil(), qd j'ai ecrit ce script il y'a 2 ans je ne connaissais pas encore très bien toutes les fonctions ;-).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.