begin process at 2010 03 20 15:06:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > PAGINATION AUTOMATIQUE POUR LISTE MULTIPAGE

PAGINATION AUTOMATIQUE POUR LISTE MULTIPAGE


 Information sur la source

Note :
6,5 / 10 - par 4 personnes
6,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :lien, liste, multipage, automatique, fonction Niveau :Débutant Date de création :20/01/2006 Date de mise à jour :08/02/2006 11:28:16 Vu :8 611

Auteur : Isengard

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cette fonction a pour but de faciliter et d'automatiser un minimum l'affichage des liens pour les listes qui s'étendent sur plusieurs pages. Par exemple lorsqu'on selectionne des élements dans une base de données et qu'on obtient 500 réponses à afficher, on a pas envie d'afficher les 500 réponses sur la même page (ou alors le chargement sera très long et la consultation sera fastidieuse...).

Pour ceux qui ne voient toujours pas, la fonction créé des liens dans le genre :
Pages : 1 ... 2 3 [4] 5 6 ... 7

Voila donc une petite fonction qui automatise tout ça. La fonction :
- Affiche en permanence un lien vers la première et la dernière page
- Affiche la page actuelle en gras
- Entoure la page actuelle d'un nombre de pages précédentes et de pages suivantes prédéfinies
- Met des ... lorsque la suite logique des pages est rompue

Les paramètres sont les suivants :
$nombre_total => Le nombre total d'éléments à afficher (toutes pages confondues, souvent le resultat de la fonction mysql_num_rows(); )
$max_row_by_page => Le nombre d'éléments par page
$link => Le lien qui sera affiché (le lien vers la page de liste)
$border => Le nombre de pages précédentes et suivantes qui entoureront la page actuelle

Source

  • function makeListLink($nombre_total,$max_row_by_page,$link,$border){
  • /* $nombre_total => Nombre total d'éléments à afficher sur toutes les pages
  • Exemple : 150 éléments
  • $max_row_by_page => Nombre d'éléments par page
  • Exemple : 10 éléments par page (=> 15 pages)
  • $link => Adresse de la page qui liste
  • Exemple : liste.php?mavariable=mavaleur
  • $border => Nombre de liens autour du lien de la page actuelle
  • Exemple : 3 (=> 1 ... 5 6 7 [8] 9 10 11 ... 25)
  • Exemple : 2 (=> 1 ... 6 7 [8] 9 10 ... 25)
  • Exemple : 1 (=> 1 ... 7 [8] 9 ... 25)
  • Synthaxe de la requete à mettre sur la page qui liste :
  • =======================================================
  • $max_row_by_page = <Valeur mise pour $max_row_by_page dans la fonction>;
  • if((!isset($_GET['begin'])) || (!is_numeric($_GET['begin']))) {
  • // Si la variable begin a une valeur étrange on commence au début de la liste
  • $requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$max_row_by_page."";
  • } else {
  • $requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$_GET['begin'].",".$max_row_by_page."";
  • }
  • */
  • // Calcul du nombre de pages necessaires
  • // Ceil = fonction arrondir au nombre supérieur
  • // Ex : 4,6 pages necessaire => 5 pages affichées
  • $nombre_page_necessaire = ceil($nombre_total / $max_row_by_page);
  • // Calcul de la page actuelle
  • $page_actuelle = ($_GET['begin'] / $max_row_by_page) +1;
  • $first_link = 1;
  • echo "<strong>Pages :</strong> ";
  • if($page_actuelle!=1){
  • // Si la page actuelle n'est pas la première, on peut afficher la premiere page'
  • // Première page
  • echo "<a href='".$link."&begin=0'>1</a>";
  • $first_link = 0;
  • }
  • if($page_actuelle > $border +2 ) {
  • // Si la page actuelle est plus loin que la bordure et la première page, on met des ...
  • echo "...";
  • }
  • for($y=0;$y<=($border-1);$y++) {
  • $z = $border - $y;
  • if($page_actuelle > ($z + 1)){
  • // Affichage des pages précédentes selon le $border défini
  • if($first_link != 1) { echo " "; }
  • $page_precedente = $page_actuelle - $z;
  • $page_begin = ($page_precedente - 1) * $max_row_by_page;
  • echo "<a href='".$link."&begin=".$page_begin."'>".$page_precedente."</a>";
  • $first_link = 0;
  • }
  • }
  • // Affichage page actuelle
  • if($first_link != 1) { echo " "; }
  • $page_begin = ($page_actuelle - 1) * $max_row_by_page;
  • echo "<strong>[".$page_actuelle."]</strong>";
  • $first_link = 0;
  • for($y=1;$y<=$border;$y++) {
  • $z = $border - $y;
  • if($page_actuelle < ($nombre_page_necessaire-$y)) {
  • // Affichage des pages suivantes selon le $border défini
  • if($first_link != 1) { echo " "; }
  • $page_suivante = $page_actuelle + $y;
  • $page_begin = ($page_suivante - 1) * $max_row_by_page;
  • echo "<a href='".$link."&begin=".$page_begin."'>".$page_suivante."</a>";
  • $first_link = 0;
  • }
  • }
  • if($page_actuelle < ($nombre_page_necessaire - ($border +1))) {
  • // Si la page actuelle et sa bordure n'atteignent pas la dernière page, on met des ...
  • echo "...";
  • }
  • if($page_actuelle != $nombre_page_necessaire ) {
  • // La page actuelle est avant la derniere page, donc on affiche la derniere page
  • // Dernière page
  • if($first_link != 1) { echo " "; }
  • $page_begin = ($nombre_page_necessaire - 1) * $max_row_by_page;
  • echo "<a href='".$link."&begin=".$page_begin."'>".$nombre_page_necessaire."</a>";
  • }
  • }
function makeListLink($nombre_total,$max_row_by_page,$link,$border){
		/* 	$nombre_total 		=> Nombre total d'éléments à afficher sur toutes les pages
		 							Exemple : 150 éléments
			$max_row_by_page 	=> Nombre d'éléments par page
									Exemple : 10 éléments par page (=> 15 pages)
		 	$link 				=> Adresse de la page qui liste
									Exemple : liste.php?mavariable=mavaleur
			$border				=> Nombre de liens autour du lien de la page actuelle
									Exemple : 3 (=> 1 ... 5 6 7 [8] 9 10 11 ... 25)
									Exemple : 2 (=> 1 ... 6 7 [8] 9 10 ... 25)
									Exemple : 1 (=> 1 ... 7 [8] 9 ... 25)
		
		Synthaxe de la requete à mettre sur la page qui liste :
		=======================================================
		
		$max_row_by_page = <Valeur mise pour $max_row_by_page dans la fonction>;
		if((!isset($_GET['begin'])) || (!is_numeric($_GET['begin']))) {
			// Si la variable begin a une valeur étrange on commence au début de la liste
			$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$max_row_by_page."";
		} else {
			$requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$_GET['begin'].",".$max_row_by_page."";
		}
		*/

		// Calcul du nombre de pages necessaires 
		// Ceil = fonction arrondir au nombre supérieur
		// Ex : 4,6 pages necessaire => 5 pages affichées
		$nombre_page_necessaire = ceil($nombre_total / $max_row_by_page);
		// Calcul de la page actuelle
		$page_actuelle = ($_GET['begin'] / $max_row_by_page) +1;
		$first_link = 1;
		echo "<strong>Pages :</strong> ";
		if($page_actuelle!=1){
			// Si la page actuelle n'est pas la première, on peut afficher la premiere page'
			// Première page 
			echo "<a href='".$link."&begin=0'>1</a>";
			$first_link = 0;
		}	
		if($page_actuelle > $border +2 ) {
			// Si la page actuelle est plus loin que la bordure et la première page, on met des ...
			echo "...";
		}
		for($y=0;$y<=($border-1);$y++) {
			$z = $border - $y;
			if($page_actuelle > ($z + 1)){
				// Affichage des pages précédentes selon le $border défini
				if($first_link != 1) { echo " "; }
				$page_precedente = $page_actuelle - $z;
				$page_begin = ($page_precedente - 1) * $max_row_by_page;
				echo "<a href='".$link."&begin=".$page_begin."'>".$page_precedente."</a>";
				$first_link = 0;
			}
		}
		
		// Affichage page actuelle
		if($first_link != 1) { echo " "; }
		$page_begin = ($page_actuelle - 1) * $max_row_by_page;
		echo "<strong>[".$page_actuelle."]</strong>";
		$first_link = 0;
		
		for($y=1;$y<=$border;$y++) {
			$z = $border - $y;
			if($page_actuelle < ($nombre_page_necessaire-$y)) {
				// Affichage des pages suivantes selon le $border défini
				if($first_link != 1) { echo " "; }
				$page_suivante = $page_actuelle + $y;
				$page_begin = ($page_suivante - 1) * $max_row_by_page;
				echo "<a href='".$link."&begin=".$page_begin."'>".$page_suivante."</a>";
				$first_link = 0;
			}
		}
		
		if($page_actuelle < ($nombre_page_necessaire - ($border +1))) {
			// Si la page actuelle et sa bordure n'atteignent pas la dernière page, on met des ...
			echo "...";
		}
		if($page_actuelle != $nombre_page_necessaire ) {
			// La page actuelle est avant la derniere page, donc on affiche la derniere page
			// Dernière page 
			if($first_link != 1) { echo " "; }
			$page_begin = ($nombre_page_necessaire - 1) * $max_row_by_page;
			echo "<a href='".$link."&begin=".$page_begin."'>".$nombre_page_necessaire."</a>";
		}
	}

 Conclusion

Attention ! Il faut adapter la requete à la base de données avec le critère LIMIT sinon ça n'a aucun interet !

Un tit exemple de requete :
$max_row_by_page = <Valeur mise pour $max_row_by_page dans la fonction>;
if((!isset($_GET['begin'])) || (!is_numeric($_GET['begin']))) {
    // Si la variable begin a une valeur étrange ou n'est pas définie on commence au début de la liste
    $requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$max_row_by_page."";
} else {
    $requete = "SELECT mes_champs FROM ma_table ORDER BY mon_champ ASC LIMIT ".$_GET['begin'].",".$max_row_by_page."";
}
Exempl e d'appel de la fonction :
makeListLink(mysql_num_rows($result),20,"liste.p hp?variable=mavaleur",3);

C'est une petite fonction comme ça pour faciliter la tache, elle peut sans aucun doute être améliorée :) Si il y a des erreurs ou des améliorations à faire, des suggestions ou des critiques je suis preneur :D


 Historique

20 janvier 2006 15:33:42 :
- Changement du nom et du niveau ;)
08 février 2006 11:28:16 :
Correction du HTML et suppression du tableau

 Sources de la même categorie

CALCUL D'UNE DISTANCE ORTHONORMIQUE par bossfoot
Source avec Zip ESPACE ADMIN SIMPLE par mousaid_88
Source avec Zip IMAGINE-CMS V2.20 par djack69
Source avec Zip AFFICHAGE ET GESTION DE DIAPORAMA EN PHP SANS BASE DE DONNÉE... par mldvb
Source avec Zip Source avec une capture PARSER ALLOCINE par cyrhades

 Sources en rapport avec celle ci

DIFFÉRENCE ENTRE DEUX DATE EN JOURS (LISTE RÉCUPÉRÉE DANS UN... par DevilTN
Source avec Zip GÉNÉRER UN MOT DE PASS ALÉATOIRE par narkos2
COURTE ET SIMPLE FONCTION RÉCURSIVE POUR LECTURE DE RÉPERTOI... par mbdx
Source avec Zip FUNCTION LINK par astro53
REDIMENSIONNEMENT AUTOMATIQUE D'IMAGES par GanJasTeR

Commentaires et avis

Commentaire de malik7934 le 20/01/2006 14:17:13

Pourquoi "Initié" ??? C'est débutant ça ! C'est d'ailleur un des premiers trucs que j'avais appris pour une galerie photo il y a des années... argh, émotion du souvenir :)

Commentaire de xeonarno le 20/01/2006 14:34:18

Peux tu renommer ton code source par "Pagination". C'est le principe que tu crée... Mais sympa ton code ^^. essaye d'en faire une classe et là ca pourra être super intéressant.

Commentaire de malalam le 20/01/2006 14:36:45 administrateur CS

Parce qu'un débutant se sur estime toujours un peu...jusqu'à ce qu'il devienne confirmé, et là, il va se sous-estimer ;-)

Bref, ceci dit, je laisse ce code : c'est toujours utile, il est commenté, et hj'ai vu pire comme programmation :-) Ceci dit oui, ç'eut été mieux en 'débutant'.

Par contre le html est limite :-) Faudrait voir à réécrire ça au propre.

Commentaire de Isengard le 20/01/2006 15:39:42

Voila voila j'ai modifié le niveau come vous me l'avez indiqué ^^ Je m'en remet à votre jugement :p

Sinon Malalam y'a que trois / quatres lignes de HTML ^^ c'est mes <b> et mes <a> qui vont pas ?

Malik> ah mais je sais que c'est pas très très compliqué de faire de la pagination (voici le mot ^^) mais c'est toujours un peu la galère à mettre en place, là c'est un système rapide ^^. Evidemment on peut faire plus evolué mais c'était pas vraiment le but ;)

Par contre pour la class je vois pas trop comment je pourrais tourner ça :/

Commentaire de malalam le 20/01/2006 16:47:42 administrateur CS

Les <b>, le tableau pas franchement nécessaire, les attributs html délimités par de simples quotes au lieu de guillemets.
Niveau php, utilise de simples quotes pour les echo, ce sera plus lisible, surtout avec le html :
echo '<a href="blabla" title="blablabla">', $bla, '</a>';

Pour ce qui est d'une classe, je ne suis pas non plus convaincu ;-)
Xeonarno => tu penses à quoi au juste ?

Pour ma part, ce que je trouverai intéressant, ce serait une fonction (ou plusieurs ) qui n'affiche rien, mais qui renvoie juste les infos nécessaires, et laisse le soin de la mise en page à l'utilisateur de la fonction (ou des fonctions ;-) ).

Commentaire de ysn le 19/03/2006 11:57:04

salut,
je sais pas comment utiliser ce code
merci de m'expliquer comment faire ..
(je debute)

Commentaire de kaputzan le 09/04/2006 18:15:30

Salut,
Je viens d'utiliser ton code sur ma plateforme en ligne.
Bravo pour ton travail très clean, tu me fais gagner un temps précieux.
Je poste ce message et je file te mettre un 9/10 !
Encore merci

Commentaire de niko14 le 28/04/2006 09:10:30

moi je le trouve pas mal ce code mais qqun pourrait il me dire ou je dois mettre qqch pour pouvoir justement afficher a l'ecran le resultat de ma requete!!
Moi je m'en sers pour faire différents liens mais la je suis un peu perdu pour savoir ou je mets ma boucle pour afficher mes liens svp!!
merciiiiii

Commentaire de saharam72 le 05/05/2006 05:38:10

1er je suis débutant en php
2éme j'arrive pas à utiliser votre code. vous n'expliquez pas l'affichage des resultas.
l'exemple makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);
n'est pas clair.
svp plus de détails sur (liste.php?variable=mavaleur).
j'éspere que vous allez répondre vite à ma requete car j'ai tellement besoin d'un code de pagination pour ma cite web et j'arrive pas à trouver

Commentaire de niko14 le 05/05/2006 08:45:36

slt saharam72
Si ca te pose problememoi j'ai trouvé ce code la qui est pas mal du tout pour faire de la pagination:

<?php

$nombreDeMessagesParPage = 5; // Le nombre de news sur chaque page
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(id_lien) AS nb_liens FROM liens');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_liens'];


// On calcule le nombre de pages à créer

$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);


if (isset($_GET['num_page']))

{

$page = $_GET['num_page']; // On récupère le numéro de la page indiqué dans l'adresse (news.php?num_page=4)

}

else // La variable n'existe pas, c'est la première fois qu'on charge la page

{

$page = 1; // On se met sur la page 1 (par défaut)

}

// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
$reponse = mysql_query("SELECT id_lien, adresse_lien, entreprise_lien, recap_entrep_lien FROM liens ORDER BY id_lien  LIMIT  " . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);


// Requête SQL

$i = 0;

?>

    <?php



// On fait une boucle pour lister tout ce que contient la table :


while ($data = mysql_fetch_array($reponse) )

{

$i++;
?>
-<a href="http://<?php echo $data[1]; ?>" target="blank" ><?php echo ucfirst($data[2]); ?></a>-<br />
<p><?php echo ucfirst(nl2br($data[3])); ?></p>
<hr />
<?php


if($i == 4)

                    {

                             echo "</tr><tr>";

                             $i = 0;

                     }

             }

             ?>

Page :

   <?

for ($i = 1 ; $i <= $nombreDePages ; $i++)

{
if ($i==$page)
{
echo '<a style="color:red;font-weight:bold;" href="index.php?action=liens&num_page=' . $i . '">' . $i . '</a> ';
}
else
{
echo '<a style="font-weight:bold;" href="index.php?action=liens&num_page=' . $i . '">' . $i . '</a> ';
}
}
?>

Commentaire de saharam72 le 06/05/2006 04:16:52

Merci niko14 d'avoir répondu aussi vite à ma requete..
bon à vrais dire je préfére le 1er code et j'arrive bien à le comprendre..c'est pas ça le probléme.
en plus je trouve pas mal d'exemples de codes de pagination sur internet mais malheuresement comme le tient ils n'expliquent pas comment afficher le résultat de la requete sur chaque page web.
bon je pense que je dois faire plus d'effort de ma part et approfondir mes connaissance en php avant de ce lancer sur la pagination :)
merci a+

Commentaire de Fouinar le 11/06/2006 20:26:45

Tout d'abord en grand merci à isengard pour cette source qui fonctionne et qui est très utile ^^

Pour saharam72 , pour l'affichage des résultats -dans le cadre d'un forum- il suffit de faire un while :

makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);
while ($row = mysql_fetch_array($result)) {

et tu mets l'affichage de ta page ici

sinon explications sur l'appel de la fonction d'après ce que j'en est fait :

makeListLink(mysql_num_rows($result),20,"liste.php?variable=mavaleur",3);

le premier parametre est tout simplement le num rows de ta requete

le second tu mets $max_row_by_page qui est la variable qui indique combien de messages apparaitront sur une page

le troisieme est tout simplement le lien vers laquelle pointeront les chiffres lorsque tu cliqueras dessus, par exemple dans mon cas lorsque tu accedes à un sujet, le lien ressemble à lire.php?forum=1&id=2. c'est donc à toi d'adapter selon tes besoins, ce qu'il voulait dire par "liste.php?variable=mavaleur" c'est que tu dois simplement mettre les variables dont tu as besoin en get, rien d'extraordianaire !

le quatrieme parametre est bien décris dans l'explication, c'est le nombre de chiffre qui entoureront la page actuelle.

j'espere que ca t'auras éclairé un minimum !
++

Commentaire de softghost le 08/01/2008 20:51:38

Bonsoir tous le monde ,
et Merci Isengard pour ce code trés utile,
tu peux expli ca svp:

$page_begin = ($page_precedente - 1) * $maxpages;

???? pourquoi multiplier sur le nombre d'affichage sur page et pourquoi le -1.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Vidéo en fonction du liste [ par Bigbuddy ] Bonsoir tout le monde voilà je voudrais faire une petite galerie vidéo.Une liste de vidéo gérée par php et mysql ( ça c'est pas un réel problême )mais redirection automatique en fonction de la disponibilité d'un serveur [ par cfgservices ] Mon site existe sur 2 serveurs ( 1 principal + 1 de sauvegarde ).Je souhaiterais cr&#233;er une redirection automatique en fonction de la r&#233;ponse la fonction mail() qui fait des siennes [ par David_monchy ] salut à tous, je me repointe avec ma fonction mail(). Décidément j'aurais tout vu avec elle.Bon alors cette fois-ci, le problème est le suivant:J'envo Exécuter une fonction en cliquant sur un lien [ par sheep974 ] Bonjour à tout le monde!!Je voulais savoir comment exécuter une fonction("affichtout()") qui dépend d'une variable i,lorsque l'on clique sur un lien:c Comment exécuter une fonction en cliquant sur un lien? [ par sheep974 ] bonjour,j'ai déjà posé cette question mais je m'étais trompé de thème, désolé...Alors voila mon problème...J'ai créée une boucle for qui permet d'appe appeler une fonction php dans un lien html [ par gaillardo ] Bonjour,Voici mon souci :    J'ai crée une page fonction.php qui regrouper toutes mes fonctions et j'aimerai pouvoir appeler l'une d'elles depuis ma p Liens et Requêtes ! [ par xeroxiss ] Bonjour tout le monde ! Voila j'ai une petite question qui peu preter a sourir mais je ne vois pas la solution à mon "probleme". Je voudrai juste savo Affichage par liste deroulante [ par nita2006 ] Bonjour , en fait je voudrais faire un affcihage a partir d'une bdd . l'affichage va etre au niveau d'un formulaire .jusque la c est bon sauf que cet guide pour formulaire [ par ramsou ] Bonjour,Je suis débutant (un peu avancé) et j'aimerai créer un guide pour un formulaire avec un retour du choix dans la box. En faite une fonction jav Coment on peut réaliser un script en PHP d'une liste déroulante en fonction d'une autre liste? [ par bestabibi ] Salut ;J'ai un probleme d'afficher une iste déroulante en fonction d'une autre liste à partir d'une base de données;Merci.


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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,718 sec (3)

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