begin process at 2012 02 09 11:19:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > NUMÉROS DE PAGE

NUMÉROS DE PAGE


 Information sur la source

Note :
9,92 / 10 - par 12 personnes
9,92 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Débutant Date de création :27/06/2004 Date de mise à jour :27/06/2004 16:28:43 Vu :8 687

Auteur : coockiesch

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

 Description

Cliquez pour voir la capture en taille normale
Suite à question sur le forum: Comment, pour une requete qui retourne beaucoup de résultats, afficher les numéros de page...

Affiche la page courante, un certain nombre de pages avant et après, le lien précédente et suivante ainsi que première et dernière...

Avec la configuration donnée, cela peut faire:
Première Précédente 4 5 6 7 8 9 10 11 12 13 14 Suivante  
(8 est la page courante)

Source

  • $nb_results_p_page = 20; // nombre de résultats par page
  • $nb_avant = 4; // nombre de page avant la page courante
  • $nb_apres = 6; // nombre de page après la page courante
  • $premiere = 1; // aficher le lien "première page" (1 ou 0)
  • $derniere = 0; // afficher le lien "dernière page" (1 ou 0)
  • $courant = empty($_GET['page']) ? 1 : $_GET['page']; // page
  • $start = ($courant - 1) * $nb_results_p_page; // start (requete mysql)
  • // comptage du nombre de lignes de la base
  • $result = mysql_query("SELECT count(id) FROM table");
  • if(!$result)
  • {
  • // redirection erreur
  • header("location: erreur.php");
  • exit;
  • }
  • $ret = mysql_fetch_array($result);
  • // nombre de lignes
  • $nb_results = $ret[0];
  • // exemple de requete
  • $result = mysql_query("SELECT * FROM table LIMIT $start, $nb_results_p_page");
  • // nombre total de pages
  • $nb_pages = ceil($nb_results / $nb_results_p_page);
  • // nombre de pages avant
  • $avant = $courant > ($nb_avant + 1) ? $nb_avant : $courant - 1;
  • // nombre de pages après
  • $apres = $courant <= $nb_pages - $nb_apres ? $nb_apres : $nb_pages - $courant;
  • // première page
  • if($premiere && $courant - $avant > 1)
  • echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '">Première</a>&nbsp;&nbsp;';
  • // page précédente
  • if($courant > 1)
  • echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant - 1) . '">Précédente</a>&nbsp;&nbsp;';
  • // affichage des numéros de page
  • for($i = $courant - $avant; $i <= $courant + $apres; $i++)
  • {
  • // page courante
  • if($i == $courant)
  • echo '<span style="color: #FF0000;">' . $i . '</span>&nbsp;&nbsp;';
  • else
  • echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $i . '">' . $i . '</a>&nbsp;&nbsp;';
  • }
  • // page suivante
  • if($courant < $nb_pages)
  • echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant + 1) . '">Suivante</a>&nbsp;&nbsp;';
  • if($derniere && $courant + $apres < $nb_pages)
  • echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $nb_pages . '">Dernière</a>&nbsp;&nbsp;';
$nb_results_p_page = 20; // nombre de résultats par page
$nb_avant = 4; // nombre de page avant la page courante
$nb_apres = 6; // nombre de page après la page courante
$premiere = 1; // aficher le lien "première page" (1 ou 0)
$derniere = 0; // afficher le lien "dernière page" (1 ou 0)
$courant = empty($_GET['page']) ? 1 : $_GET['page']; // page
$start = ($courant - 1) * $nb_results_p_page; // start (requete mysql)

// comptage du nombre de lignes de la base
$result = mysql_query("SELECT count(id) FROM table");
if(!$result)
{
   // redirection erreur
   header("location: erreur.php");
   exit;
}
$ret = mysql_fetch_array($result);
// nombre de lignes
$nb_results = $ret[0];

// exemple de requete
$result = mysql_query("SELECT * FROM table LIMIT $start, $nb_results_p_page");

// nombre total de pages
$nb_pages = ceil($nb_results / $nb_results_p_page);
// nombre de pages avant
$avant = $courant > ($nb_avant + 1) ? $nb_avant : $courant - 1;
// nombre de pages après
$apres = $courant <= $nb_pages - $nb_apres ? $nb_apres : $nb_pages - $courant;

// première page
if($premiere && $courant - $avant > 1)
   echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '">Première</a>&nbsp;&nbsp;';
   
// page précédente
if($courant > 1)
   echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant - 1) . '">Précédente</a>&nbsp;&nbsp;';

// affichage des numéros de page
for($i = $courant - $avant; $i <= $courant + $apres; $i++)
{
   // page courante
   if($i == $courant)
      echo '<span style="color: #FF0000;">' . $i . '</span>&nbsp;&nbsp;';
   else
      echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $i . '">' . $i . '</a>&nbsp;&nbsp;';
}

// page suivante
if($courant < $nb_pages)
   echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant + 1) . '">Suivante</a>&nbsp;&nbsp;';
   
if($derniere && $courant + $apres < $nb_pages)
   echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $nb_pages . '">Dernière</a>&nbsp;&nbsp;';



 Sources du même auteur

GÉRER UN .HTPASSWD
RÉCUPÉRER L'IP DU VISITEUR
Source avec Zip Source avec une capture IMAGE ANTI-SPAM
MOTEUR DE RECHERCHE DANS BDD II
PRETTY DATE

 Sources de la même categorie

Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000
Source avec Zip Source avec une capture GENERATEUR DE BOUTONS DE PARTAGES POUR RESEAUX SOCIAUX par cod57

Commentaires et avis

Commentaire de BeCaSiNe le 27/06/2004 16:17:49

MERCI !!!!

Commentaire de BeCaSiNe le 27/06/2004 16:21:39

lol
Il y a une faute !!
Ta oublié $ à la preimiere ligne !!

Commentaire de coockiesch le 27/06/2004 16:27:11

Erreur lors du copié collé, je change ca! Merci pr l'info!

@++

R@f

Commentaire de pyranhaz le 28/06/2004 01:38:54

Encore une job bien fait ;-)

Et comment utile pour mon site de centaine d'items pour ne pas exploser la bande passante inutilement...

Merci infiniement pour ce code à la google :d

Commentaire de mfaraday le 29/06/2004 20:04:38

Salut juste une petite question...

Pour afficher la dernière page... j'avais un petit problème que j'air résolu come ça :

if($courant + $apres &lt; $nb_pages && $courant != $nb_pages)

mon problème était que je pouvais pas cliquer sur dernière quand j'étais à la page 8 sur 9...

Florian

Commentaire de kalamya le 26/01/2005 14:25:02

Carrément excellent !
Enfin un exemple clair sur la pagination qui fonctionne à merveille. Merci beaucoup !

Commentaire de pmthelord le 25/04/2005 17:46:45

esque tu pourrai me faire le meme script avec de l'interbase stp ???? :'(
moi je galere tro tro !!!! ca marche nikel en sql ms des ke tu passe avec interbase c la misere !!!!
alor si qqun peu maider se serai cool ;)

Commentaire de pmthelord le 25/04/2005 17:53:17

et comment eske l'on fait pour le melanger avec l'affichage de nos resultat par exemple ???,
paceke la ya ke le nombre de page et pa laffichage ... ms je ne c po ou le mettre ou bien sil faut enregistrer ce code telle une fonction ou bien si on peu l'utiliser direct ds le fichier comme ca ...
merci de me repondre a bientot

Commentaire de coockiesch le 25/04/2005 19:02:39

Salut!
Je comprends pas ce que tu veux faire, l'affichage est là... Tu le veux d'une autre façon?

Je connais pas interbase, dsl...

@++

R@f

Commentaire de pmthelord le 25/04/2005 21:53:43

Bah ouais c'est cale problème ... avec interbase c'est lourd car les requete du style "SELECT * FROM TABLE limit ..." n'existe pas :s

Commentaire de Anthomicro le 24/08/2005 11:10:17

Salut,

suite à la dernière source en date sur PHPCS pour réaliser ça je suis allé consulter cette source meilleure globalement, mais toujours à base de LIMIT :-( ce qui, sur une table comportant pas mal d'enregistrements, n'est pas bon.

Commentaire de coockiesch le 24/08/2005 11:22:44

Il faudrait améliorer ca comment?

@++

R@f

Commentaire de Anthomicro le 24/08/2005 11:27:33

un exemple (je vais prendre celui de mon forum)

tu as une table avec des id autoincrémentés (vu que les topics ont chacun un ID unique), j'ai rajouté un champ "id_class" qui lui est dans le sens inverse de l'id, ce qui évite de trier la table en ID DESC, mais en id_class ASC (bref je change pas ça). Ensuite quand j'ai besoin de la page 1 bah je fais ça par exemple :

SELECT machin,truc FROM table WHERE id_class BETWEEN 0 AND 20 (avec 20 enregistrements par page)

tu mets un index sur le champ id_class et t'as un forum qui ira aussi vite que t'ai 1000 ou 100000 enregistrements (enfin presque mais on se comprend, tandis qu'avec LIMIT plus t'auras d'enregistrements et plus ce sera lent).

Commentaire de coockiesch le 24/08/2005 11:29:20

Salut!
Vi, mais par contre, ca pose pb dès que tu supprimes un truc parce parlà...

@++

R@f

Commentaire de Anthomicro le 24/08/2005 11:31:58

non, d'où le deuxième champ id_class, et plus de problème.

Commentaire de coockiesch le 24/08/2005 11:57:12

Dsl d'ête lourd (lol) mais je pige pas torp comment tu gère ce deuxième champ...

@++

R@f

Commentaire de Anthomicro le 24/08/2005 12:01:42

En fait c'est un champ qui sera toujours incrémenté inversement par rapport à l'autoincrément normal (pour que les messages les plus récents remontent et soient affichés en premiers). Lorsque je supprime un message portant l'id_class 2 par exemple, je supprime un id unique, il y aura donc un trou dans la table. Pour pallier à ça j'update tous les id_class supérieurs à 2 et je les décrémente de 1, et hop plus de trou dans le champ id_class vu que je me sers de ce champ uniquement pour classer mes données et les récupérer. Je me sers juste de l'id unique pour identifier les topics c'est tout.

Commentaire de coockiesch le 24/08/2005 12:04:30

:) Oki doki, merci pr les infos!

@++

R@f

Commentaire de electroweb le 25/08/2005 12:11:07

Merci pour ce script. Il est propre et agréable à lire. Je suis en train de le mettre dans une classe.

Bravo et bonne continuation.

Commentaire de critou le 29/09/2005 17:54:25

Bonjour,

Juste une petie question de à quoi fait référence $_SERVER['SCRIPT_NAME']?

Ton script marche très bien merci beacoup mais je n'arrive pas à l'intégrer dans mon script existant.

Merci de ta réponse

Critou

Commentaire de BeCaSiNe le 29/09/2005 17:56:32

$_SERVER['SCRIPT_NAME'] c'est le nom de la page en cour

Commentaire de critou le 29/09/2005 18:01:40

Comment puis-je lier mon script avec celui là ou où faut-il que je l'intègre?

Merci d'avance

Commentaire de BeCaSiNe le 29/09/2005 18:02:40

Bah explique nous t'es requete !

Ca va beaucoup aider !

Commentaire de critou le 29/09/2005 18:08:29

J'ai un script ListePhotos.php qui affiche sous forme de tableau des champs d'une base de données et j'aimerais afficher ce tableau sur plusieurs pages. Par exemple tout les 5 enregistrement je change de page.

Commentaire de irus le 25/10/2005 12:33:35

Merci pour ton code tres simple bien explique et efficace @+

Commentaire de irus le 25/10/2005 13:05:56

Merci pour ton code tres simple bien explique et efficace @+

Commentaire de petitstitch le 20/12/2005 17:18:18

Excellent !!! ;o)

Commentaire de DyMoN le 25/01/2006 17:59:11

Ceci est trés bien détaillé c'est exactement ce qu'il me faut mais le probleme est que :
Comment l'integrer a ma page ?

Je l'ai integre cela apparait parfaitement mais pas le resultat.

a quel endroit placer ce code avant laffichage de mon tableau?

Je suis bloqué mercide m'aider.

Commentaire de DyMoN le 25/01/2006 18:38:57

C bon j'ai reussi à l'integrer
je n'avait pas vu la ligne:

// exemple de requete
$result = mysql_query("SELECT * FROM table LIMIT $start, $nb_results_p_page");
  
C'est ce qui posé probleme avec ma requete.

Merci pour ton code tres bien presenté et qui m'aide enormement.

Derniere question:
J'ai mis ce bout de con dans un fichier
et je l'ai inclu dans ma page avec la fonction include();

J'ai entendu parlé que cette fonction etait dangereuse.
Y'a til une autre façon d'apeller cette page ?

Je c'est que sa sort du contexte mais bon..

Encore merci

Commentaire de coockiesch le 25/01/2006 20:32:24

Salut!
Include n'est pas une fonction dangereuse en soi quand on est sûr de la page qu'elle appelle.
Par exemple: include('pages.php'); n'est pas du tout dangereux...

Mais si tu fais:
include( $_GET['page'] );
Là, c'est dangereux car si quelqu'un appelle ta page comme ceci:
index.php?page=http://www.unautresite.com/script.php
Et ben ca exécutera le script qu'il veut. On appelle ca la faille des includes!

Si tu veux faire un truc genre pseudo frames, tu passes une valeur dans l'url pour page ( genre: news, contacts, livreor ) et selon cette valeur tu inclut la page que tu veux ( via un switch, par exemple ).

Ca répond à ta question?

@++

R@f

Commentaire de DyMoN le 26/01/2006 15:00:32

C'est ce que j'ai fait ,

Si yavait plus souvent des sources bien presentéés et bien explicite comme celle ci sa serait cool.
merci encore..

Commentaire de bebebof le 12/03/2006 23:19:07

bonjour,
pas mal mais j'arrive pas à le faire marcher comme il faut. j'affiche le résultat sur 4 colonnes et 12 par page soit 3 lignes de 4 enregistrements. sur la première page c'est ok, mais dès que je clique sur page 2 j'ai plus rien...
Quelqu'un à une solution ?

Merci !

Commentaire de coockiesch le 13/03/2006 17:21:25

Salut!
Quand tu es sur ta page deux, après avoir cliqué, quelle est l'url?
Où as tu mis mon code?

@++

R@f

Commentaire de bebebof le 13/03/2006 18:18:13

bonjour,

url de la page 2 : mapage.php?page=2

J'ai fais des tests et j'ai remarqué que dans la requete (ligne 22) si l'on met pas de WHERE ca fonctionne, et dès que l'on met un WHERE, la première page est ok puis les pages suivantes sont vides. Est-ce normal ? ou un defaut de mon script ? faites le test, vous verrez.
Merci pour votre aide, ce script est bien et je sais par expérience que le plus gros bug est souvent le developpeur!
Merci pour votre réponse !

Commentaire de coockiesch le 13/03/2006 20:29:24

Hum...
Tu arrives à me montrer comment et où tu as mis mon code?

@++

R@f

Commentaire de bebebof le 15/03/2006 21:35:41

Bonsoir !

Un grand bravo à cookiesch pour la rapidité avec laquelle il a résolu mon problème avec ce script !

super sympa !
un excellent script !
A++

Commentaire de villou le 17/03/2006 00:07:17

Bonsoir !

Vraiment bien ce code, mais j'ai tout de même une petite question. Je suis débutant en php et j'aimerai savoir comment je pourrais faire pour afficher, à l'aide de ce script, les news en sens inverse. Donc le plus grand ID est affiché à la page 1...

Merci pour votre aide !

Commentaire de villou le 17/03/2006 12:51:39

Je viens de comprendre qu'il faut mettre le ORDER BY avant LIMIT...

Donc a la place de

// exemple de requete
$result = mysql_query("SELECT * FROM table LIMIT $start, $nb_results_p_page");

il faut mettre

// exemple de requete
$result = mysql_query("SELECT * FROM table order by ID desc LIMIT $start, $nb_results_p_page");

Commentaire de coockiesch le 19/03/2006 16:41:13

Et ben voilà un pb résolu sans moi, :) :D

@++

R@f

Commentaire de YeahYeahYeahs le 29/04/2006 00:07:15

Salut, j'ai cogité un moment sur ta très bonne source (merci).
Le problème c'est la double requête sur chaque page...(ça m'ennuie). De plus,ça m'arrange pas car je pense faire une recherche via un formulaire methode post.

Que penses-tu de l'utilisation de variables de sessions pour stocker le résultat du count et le mot-clé recherché?

Sinon il y a la soluce d'Anthomicro mais ça demande un remaniement complet de la bdd.


Commentaire de coockiesch le 29/04/2006 14:42:56

Salut!
Oui, en effet, je pense que ton idée est très bien! :)
( de même que la requête de recherche peut être stockée en session en ajoutant juste le LIMIT à chaque fois )

@++

R@f

Commentaire de stef1589 le 31/07/2006 22:05:19

super! ca m a beaucoup servi, merci

Commentaire de poiutyh le 13/10/2006 14:11:34

euh d'accord j'ai a peu près compris le script mais si je colle ca cela ne m'affiche que la pagination ??

Ou se passe l'affichage des données de la tables ?

Commentaire de coockiesch le 15/10/2006 10:24:11

Salut!
Que la pagination... :-)

C'est à toi de faire l'affichage de tes données! Je l'air pas fait car c'était pas le but de la source et ça change trop d'un cas à l'autre...

@++

R@f

Commentaire de staykool le 16/05/2007 05:21:47

electroweb, est-ce que tu as mis le code dans une classe finalement?

Moi j'ai ajouter un peu de style sur l'affichage et j'utilise aussi mysqli au lieu de mysql... Je vous en fait donc part! j'espère que tout sera beau... c'est la première fois que je répond à un commentaire! :o))

$nb_results_p_page = 1; // nombre de résultats par page
$nb_avant = 3; // nombre de page avant la page courante
$nb_apres = 3; // nombre de page après la page courante
$premiere = 1; // aficher le lien "première page" (1 ou 0)
$derniere = 1; // afficher le lien "dernière page" (1 ou 0)
$courant = empty($_GET['page']) ? 1 : $_GET['page']; // page
$start = ($courant - 1) * $nb_results_p_page; // start (requete mysql)

// comptage du nombre de lignes de la base
$sqlSelectUser = "SELECT count(id_user) FROM user";
$resSelectUser = $mysqli->query($sqlSelectUser);
$nb_user = $resSelectUser->fetch_array();
    
// nombre de lignes
$nb_results = $nb_user[0];
    
// nombre total de pages
$nb_pages = ceil($nb_results / $nb_results_p_page);
    
// nombre de pages avant
$avant = $courant > ($nb_avant + 1) ? $nb_avant : $courant - 1;
    
// nombre de pages après
$apres = $courant <= $nb_pages - $nb_apres ? $nb_apres : $nb_pages - $courant;
    
echo '<div class="pagination">
<ul>';
    
// première page
if($premiere && $courant > 1)
    echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '">Première</a>&nbsp;&nbsp;</li>';
else
    echo '<li class="disablepage">Première</li>';
    
// page précédente
if($courant > 1)
    echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant - 1) . '">Précédente</a>&nbsp;&nbsp;</li>';
else
    echo '<li class="disablepage">Précédente</li>';
    
// affichage des numéros de page
for($i = $courant - $avant; $i <= $courant + $apres; $i++)
{
    
    // page courante
    if($i == $courant)
        echo '<li  class="currentpage">' . $i . '</li>';
    else
echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $i . '">' . $i . '</a>&nbsp;&nbsp;</li>';
}
    
// page suivante
if($courant < $nb_pages)
    echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant + 1) . '">Suivante</a>&nbsp;&nbsp;</li>';
else
    echo '<li class="disablepage">Suivante</li>';
    
if($derniere && ($courant < $nb_pages))
    echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $nb_pages . '">Dernière</a>&nbsp;&nbsp;</li>';
else
    echo '<li class="disablepage">Dernière</li>';
    
echo '</ul>
</div>
<table align="center">
    <tr>
        <td align="center" colspan="3">
    <b>Page '.$courant.' sur '.$nb_pages.'</b>
        </td>
    </tr>
</table>';

=================
CSS
=================

.pagination {padding: 2px;}
.pagination ul {margin: 0; padding: 0; text-align: left; font-size: 16px;}
.pagination li {list-style-type: none; display: inline; padding-bottom: 1px;}
.pagination a, .pagination a:visited {padding: 0 5px; border: 1px solid rgb(0,51,102); text-decoration: none; color: #2e6ab1;}
.pagination a:hover, .pagination a:active {border: 1px solid #2b66a5; color: #000; background-color: lightblue;}
.pagination li.currentpage {font-weight: bold; padding: 0 5px; border: 1px solid navy; background-color: rgb(0,51,102); color: #FFF;}
.pagination li.disablepage {padding: 0 5px; border: 1px solid rgb(145,145,145); color: #929292;}
.pagination li.currentpage, .pagination li.disablepage { /*IE 6 and below. Adjust non linked LIs slightly to account for bugs*/ margin-right: 5px; padding-right: 5px;}

Commentaire de cdie le 05/05/2010 16:12:39

Nikel, exactement ce que je cherchais ! Merci :)

Commentaire de 260686 le 27/07/2010 13:24:32

Waoww
Merci coockiesch,
Juste une petite information : en pgsql on change
"SELECT * FROM table LIMIT $start, $nb_results_p_page"
en
"SELECT * FROM table LIMIT $nb_results_p_page OFFSET $start"

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

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

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