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 !

NUMÉROS DE PAGE


Information sur la source

Catégorie :Astuces Niveau : Débutant Date de création : 27/06/2004 Date de mise à jour : 27/06/2004 16:28:43 Vu : 6 384

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (45)
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;';

Commentaires et avis

signaler à un administrateur
Commentaire de BeCaSiNe le 27/06/2004 16:17:49

MERCI !!!!

signaler à un administrateur
Commentaire de BeCaSiNe le 27/06/2004 16:21:39

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

signaler à un administrateur
Commentaire de coockiesch le 27/06/2004 16:27:11

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

@++

R@f

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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 !

signaler à un administrateur
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 ;)

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de coockiesch le 24/08/2005 11:22:44

Il faudrait améliorer ca comment?

@++

R@f

signaler à un administrateur
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).

signaler à un administrateur
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

signaler à un administrateur
Commentaire de Anthomicro le 24/08/2005 11:31:58

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

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de coockiesch le 24/08/2005 12:04:30

:) Oki doki, merci pr les infos!

@++

R@f

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
Commentaire de BeCaSiNe le 29/09/2005 17:56:32

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

signaler à un administrateur
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

signaler à un administrateur
Commentaire de BeCaSiNe le 29/09/2005 18:02:40

Bah explique nous t'es requete !

Ca va beaucoup aider !

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de irus le 25/10/2005 12:33:35

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

signaler à un administrateur
Commentaire de irus le 25/10/2005 13:05:56

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

signaler à un administrateur
Commentaire de petitstitch le 20/12/2005 17:18:18

Excellent !!! ;o)

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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..

signaler à un administrateur
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 !

signaler à un administrateur
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

signaler à un administrateur
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 !

signaler à un administrateur
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

signaler à un administrateur
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++

signaler à un administrateur
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 !

signaler à un administrateur
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");

signaler à un administrateur
Commentaire de coockiesch le 19/03/2006 16:41:13

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

@++

R@f

signaler à un administrateur
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.


signaler à un administrateur
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

signaler à un administrateur
Commentaire de stef1589 le 31/07/2006 22:05:19

super! ca m a beaucoup servi, merci

signaler à un administrateur
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 ?

signaler à un administrateur
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

signaler à un administrateur
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;}

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,250 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é.