Pagination classique

Affichage page par page classique. Lecture à partir d'une base MySQL. Script complet avec exemples. 


Information sur les mises à jour

Dernière mise à jour :

26 Sept 2019
refactoring du code en PHP 7
fonctionnement du code vérifié

29 Mars 2026
amélioration du code
maintenance du code

56 003  vues
Compatibilité du code
PHP 5, PHP 7 et PHP 8
  code classé dans   Page par Page
  code source classé dans   Page par Page
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
                    
<?php
/*------------------------------*/
/*
Titre : Pagination classique

Date édition : 05 Sept 2004
Date mise a jour : 26 Sept 2019

Rapport de la maj:
- refactoring du code en PHP 7
- fonctionnement du code vérifié
Date mise a jour : 29 Mars 2026

Rapport de la maj:
- amélioration du code
- maintenance du code
*/
/*------------------------------*/?>
CREATE TABLE IF NOT EXISTS `phpsources_test` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`texte` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Données de la table `phpsources_test`
--

INSERT INTO `phpsources_test` (`id`, `texte`) VALUES
(1, 'I love PHP'),
(2, 'I do PHP'),
(3, 'Hello world'),
(4, 'Good morning'),
(5, 'Good night'),
(6, 'Im Free');

<?php
// ====================== CONFIGURATION BASE DE DONNÉES ======================
$db_server = 'localhost';
$db_name = ''; // ??? Mets le nom de ta base de données
$db_user_login = 'root';
$db_user_pass = ''; // ??? Mets ton mot de passe

// Connexion à la base de données
$conn = mysqli_connect($db_server, $db_user_login, $db_user_pass, $db_name);

if (!$conn) {
die('Erreur de connexion à la base de données : ' . mysqli_connect_error()
);
}

// Configuration de l'encodage UTF-8
mysqli_set_charset($conn, "utf8");

// ====================== PAGINATION ======================
$limit = 2;
// Nombre d'enregistrements par page
$page = isset($_GET['page']) ? (int)$_GET['page'] : 0;

// Sécurité : on empêche les numéros de page négatifs
if ($page < 0) $page = 0;

$offset = $page * $limit; // Calcul du début (anciennement $debut)

// Requête pour compter le nombre total d'enregistrements
$count_query = "SELECT COUNT(*) as total FROM phpsources_test";
$count_result = mysqli_query($conn, $count_query);
$total_row = mysqli_fetch_assoc($count_result);
$nb_total = (int)$total_row['total'];

// Requête principale avec LIMIT
$query = "SELECT * FROM phpsources_test ORDER BY id ASC LIMIT $offset, $limit";
$result = mysqli_query($conn, $query);
?>

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Pagination - Test PHP</title>
<style>
body { font-family: Arial, sans-serif; }
.pagination { margin: 20px 0; }
.pagination a { margin: 0 5px; padding: 5px 10px; text-decoration: none;
border: 1px solid #ccc; }
.pagination b { margin: 0 5px; padding: 5px 10px; background: #ddd; }
</style>
</head>
<body>

<h2>Contenu de la table (pagination)</h2>

<div class="pagination">
<?php
// Liens de pagination
if ($nb_total > $limit) {

// Bouton Précédent
if ($page > 0) {
$precedent = $page - 1;
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $precedent .
'">? PRÉCÉDENT</a> ';
}

// Numéros de pages
$total_pages = ceil($nb_total / $limit);
for ($i = 0; $i < $total_pages; $i++) {
$j = $i + 1;
if ($i == $page) {
echo '<b>' . $j . '</b> ';
} else {
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $i . '">' . $j
. '</a> ';
}
}

// Bouton Suivant
if ($offset + $limit < $nb_total) {
$suivant = $page + 1;
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $suivant .
'">SUIVANT ?</a>';
}
}
?>
</div>

<hr>

<?php
// Affichage des résultats
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo htmlspecialchars($row['texte'], ENT_QUOTES, 'UTF-8') . "<br>\n";
}
} else {
echo "<p>Aucun enregistrement trouvé.</p>";
}
?>

</body>
</html>

<?php
// Fermeture de la connexion
mysqli_close($conn);
?>

Si vous passez progressivement vers PHP 7 ou 8, on vous conseille cette version
avec mysqli en style orienté objet :

<?php
// ... même configuration ...

$conn = new mysqli($db_server, $db_user_login, $db_user_pass, $db_name);

if ($conn->connect_error) {
die('Erreur de connexion : ' . $conn->connect_error);
}

$conn->set_charset("utf8");

$limit = 2;
$page = max(0, (int)($_GET['page'] ?? 0));
$offset = $page * $limit;

// Compte total
$total_result = $conn->query("SELECT COUNT(*) as total FROM phpsources_test");
$nb_total = $total_result->fetch_assoc()['total'];

$result = $conn->query(
"SELECT * FROM phpsources_test ORDER BY id ASC LIMIT $offset, $limit");
?>

<!-- Le reste du HTML est identique -->
<?php
/*------------------------------*/
/*
Titre : Pagination classique

Date édition : 05 Sept 2004
Date mise a jour : 26 Sept 2019

Rapport de la maj:
- refactoring du code en PHP 7
- fonctionnement du code vérifié
Date mise a jour : 29 Mars 2026

Rapport de la maj:
- amélioration du code
- maintenance du code
*/
/*------------------------------*/?>
CREATE TABLE IF NOT EXISTS `phpsources_test` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`texte` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Données de la table `phpsources_test`
--

INSERT INTO `phpsources_test` (`id`, `texte`) VALUES
(1, 'I love PHP'),
(2, 'I do PHP'),
(3, 'Hello world'),
(4, 'Good morning'),
(5, 'Good night'),
(6, 'Im Free');

<?php
// ====================== CONFIGURATION BASE DE DONNÉES ======================
$db_server = 'localhost';
$db_name = ''; // ??? Mets le nom de ta base de données
$db_user_login = 'root';
$db_user_pass = ''; // ??? Mets ton mot de passe

// Connexion à la base de données
$conn = mysqli_connect($db_server, $db_user_login, $db_user_pass, $db_name);

if (!$conn) {
die('Erreur de connexion à la base de données : ' . mysqli_connect_error()
);
}

// Configuration de l'encodage UTF-8
mysqli_set_charset($conn, "utf8");

// ====================== PAGINATION ======================
$limit = 2;
// Nombre d'enregistrements par page
$page = isset($_GET['page']) ? (int)$_GET['page'] : 0;

// Sécurité : on empêche les numéros de page négatifs
if ($page < 0) $page = 0;

$offset = $page * $limit; // Calcul du début (anciennement $debut)

// Requête pour compter le nombre total d'enregistrements
$count_query = "SELECT COUNT(*) as total FROM phpsources_test";
$count_result = mysqli_query($conn, $count_query);
$total_row = mysqli_fetch_assoc($count_result);
$nb_total = (int)$total_row['total'];

// Requête principale avec LIMIT
$query = "SELECT * FROM phpsources_test ORDER BY id ASC LIMIT $offset, $limit";
$result = mysqli_query($conn, $query);
?>

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Pagination - Test PHP</title>
<style>
body { font-family: Arial, sans-serif; }
.pagination { margin: 20px 0; }
.pagination a { margin: 0 5px; padding: 5px 10px; text-decoration: none;
border: 1px solid #ccc; }
.pagination b { margin: 0 5px; padding: 5px 10px; background: #ddd; }
</style>
</head>
<body>

<h2>Contenu de la table (pagination)</h2>

<div class="pagination">
<?php
// Liens de pagination
if ($nb_total > $limit) {

// Bouton Précédent
if ($page > 0) {
$precedent = $page - 1;
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $precedent .
'">? PRÉCÉDENT</a> ';
}

// Numéros de pages
$total_pages = ceil($nb_total / $limit);
for ($i = 0; $i < $total_pages; $i++) {
$j = $i + 1;
if ($i == $page) {
echo '<b>' . $j . '</b> ';
} else {
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $i . '">' . $j
. '</a> ';
}
}

// Bouton Suivant
if ($offset + $limit < $nb_total) {
$suivant = $page + 1;
echo '<a href="' . $_SERVER['PHP_SELF'] . '?page=' . $suivant .
'">SUIVANT ?</a>';
}
}
?>
</div>

<hr>

<?php
// Affichage des résultats
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo htmlspecialchars($row['texte'], ENT_QUOTES, 'UTF-8') . "<br>\n";
}
} else {
echo "<p>Aucun enregistrement trouvé.</p>";
}
?>

</body>
</html>

<?php
// Fermeture de la connexion
mysqli_close($conn);
?>

Si vous passez progressivement vers PHP 7 ou 8, on vous conseille cette version
avec mysqli en style orienté objet :

<?php
// ... même configuration ...

$conn = new mysqli($db_server, $db_user_login, $db_user_pass, $db_name);

if ($conn->connect_error) {
die('Erreur de connexion : ' . $conn->connect_error);
}

$conn->set_charset("utf8");

$limit = 2;
$page = max(0, (int)($_GET['page'] ?? 0));
$offset = $page * $limit;

// Compte total
$total_result = $conn->query("SELECT COUNT(*) as total FROM phpsources_test");
$nb_total = $total_result->fetch_assoc()['total'];

$result = $conn->query(
"SELECT * FROM phpsources_test ORDER BY id ASC LIMIT $offset, $limit");
?>

<!-- Le reste du HTML est identique -->

Exemple :

 
01
02
03
04
05
06
07
08
09
                    
Imprime :

<b>1</b><a href="test.php?page=1">2</a>
<a href="test.php?page=2">3</a>
<a href="test.php?page=1">SUIVANT</a>

I love PHP<br />
I do PHP<br />
Imprime :

<b>1</b><a href="test.php?page=1">2</a>
<a href="test.php?page=2">3</a>
<a href="test.php?page=1">SUIVANT</a>

I love PHP<br />
I do PHP<br />

      Fonctions du code - Doc officielle PHP

   php.net  
Description
Versions PHP
    ceil
Arrondit au nombre supérieur
PHP 4, 5, 7 et 8
    die
Alias de la fonction exit
PHP 4, 5, 7 et 8
    echo
Affiche une chaîne de caractères
PHP 4, 5, 7 et 8
    htmlspecialchars
Convertit les caractères spéciaux en entités HTML
PHP 4, 5, 7 et 8
    isset
Détermine si une variable est déclarée et est différente de null
PHP 4, 5, 7 et 8
    max
La plus grande valeur
PHP 4, 5, 7 et 8
    mysqli_close
Ferme une connexion
PHP 5, 7 et 8
    mysqli_connect
Alias de mysqli::__construct
PHP 5, 7 et 8
    mysqli_query
Exécute une requête sur la base de données
PHP 5, 7 et 8

[29]

  • avatar

    Invité

    25 Sept 2019 à 12:27

    Je viens d'essayer le code, après des ptites adaptations perso ca fonctionne nickel

  • avatar

    Invité

    08 Mai 2012 à 05:24

    Bonjour Le code fonctionne bien mais comment faire pour afficher ceci : 1-2-3-4-5-6-"..."SUIVANT
    PLutot qu'une liste infiniment de numero : 1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20.etc.... Merci !!!

  • avatar

    Jamstar

    18 Jan 2011 à 14:16

    Merci pour votre script ca fonctionne tres bien et pas compliqué à adapter !

  • avatar

    Invité

    29 Sept 2010 à 12:18

    Merci infiniment Mon ami
    ça marche convenablement

  • avatar

    KOogar

    06 Mai 2010 à 14:33

    avec recherche ou sans recherche c'est du pareil au meme, ton probleme peux venir de la ligne 26 ou tu dois egalement paramétrer la requete... select champ1from t1 like "%key%"

  • avatar

    Invité

    06 Mars 2009 à 12:30

    Le scripte marche bien. Par contre lorqu'on fait une recherche par critère il affiche bien les résultats attendus, mais avec tous les liens. Par exemple j'ai fait une recherche j'obtiens 1 seul engregistement. normalement l'affichage doit être à 1 sans lien. Chez moi il m'affiche 1,2,etc... avec les différents liens. Il me semble qu'il n'est pas adapté pour des recherches affinées. Normalement quand il y a un seul 1 seul enregistrement et que la limte est à 3 par exemple les liens suivants et précédents doivent disparaîtrent. Merci de m'aider s'il vous plaît.

  • avatar

    Invité

    18 Fév 2009 à 17:30

    Bonjour, je viens d'essayer de faire fonctionner ce script, mais apparemment il ya une erreur sur la requete qui affiche le contenu de la table. Il n'accepte pas le "ORDER BY id
    ASC $limit_str" si j'enleve, il m'affiche la table, mais malheureusement pas les numéros de pages.
    Si quelqu'un aurait une idée et merci pour le script.
     

  • avatar

    Forty

    18 Nov 2008 à 16:48

    Pour ceux qui ont l'option PHP register_globals = Off il faut remplacer $PHP_SELF par $_SERVER['PHP_SELF']

  • avatar

    Invité

    27 Oct 2008 à 18:09

    salut!
    svp ce script n'as pas marché avec moi sachant que j'ai le logiciel easy-php version1.1.8

  • avatar

    Vrachid

    27 Sept 2008 à 13:07

    bonjour à tous
    voila je viens d'essayer ce code il est très bien sauf que quand je navigue entre les pages mes enregistrement ne s'affiche pas
    à l'execution dans la première page les résultats sont affichés si je vais sur une autre page elle est vide malgré que j'ai plein d'enregistrement dans ma base et meme si je retourne sur la première page rien ne s'affiche

  • avatar

    Magieweb

    24 Août 2008 à 01:27

    Merci bien pour ce script, exactement ce que j'attendais, très facile à utiliser, je l'ai modifié à ma sauce et il fonctionne nikel!!!
    Beaucoup de commentaires clairs, encore merci et félicitations!

  • avatar

    Nrj82

    20 Nov 2007 à 17:37

    problem est resolu j'ai du faire quelque changement au niveau du scripte le personalisé selon mé besoin, sinon il marche parfaitement et je bravo a celui qu'il a cree

  • avatar

    Nrj82

    20 Nov 2007 à 16:51

    Bonjour ,

    j'ai eu meme problem que IMMO

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-7\www\site_00\testact.php on line 315

    LA LINE 315 est :
    $nb_total=mysql_num_rows($ret);
    Est ce quelqu'un voit ou il peut y'avoir le problem ?

  • avatar

    PhpSources

    28 Oct 2007 à 18:36

    Wamp est un serveur web que beaucoup préfère à Easyphp car ses fonctionnalités sont bien plus souples et étendues. Je vous conseille de désinstaller easyphp avant d'installer Wamp si vous êtes intéressé par ce serveur.

  • avatar

    Mygale

    28 Oct 2007 à 17:46

    OK j'ai testé avec le easyphp.ini modifié je n'ai aucun changement. D'ailleurs même sans cette modification, le script continuait de s'exécuter mais sans les résultats escomptés c'est à dire pas d'affichage des données suivantes.
    En tous cas merci de votre aide. J'abuse encore un peu étant tout débutant je suppose que Wamp est un débboguer? Ou sagit*il d'autre chose?

  • avatar

    PhpSources

    28 Oct 2007 à 17:30

    Cette directive désactive les notices d'erreurs, ce qui permettra au script de continuer
    -->> ajouter la ligne a votre fichier de configuration (easyphp.ini si mes souvenirs sont bons..)
    error_reporting = E_ALL & ~E_NOTICE
    -->> rebootez votre serveur.

    Si cela ne marche toujours pas, je vous conseille soit d'utiliser Wamp et/ou de tester en ligne pour voir si votre probleme n'est pas du à un probleme de script.

  • avatar

    Mygale

    28 Oct 2007 à 17:11

    Je veux bien essayer mais je ne sais pas comment désactiver ces notices. J'ai fait une
    recherche dans php.ini et il n'a pas trouvé error_reporting? Et à quoi sert cette directive?

  • avatar

    KOogar

    28 Oct 2007 à 16:46

    et en désactivant les notices ?? -->> php.ini
    -->>
    error_reporting = E_ALL & ~E_NOTICE

  • avatar

    Mygale

    28 Oct 2007 à 16:03

    Mes register_globals sont à off
    quant à la correction fonctionne pas non plus.

    Je suis à cours d'idées et pourtant je dois pas être le seul à vouloir faire afficher un BD page par page en ayant comme sélecteur dans la requête des variable post?

    En tous cas merci

  • avatar

    KOogar

    28 Oct 2007 à 15:34

    mettez les globals de votre serveur a OFF -->> fichier php.ini -->> register_globals = Off
    ou
    peut-etre utiliser correction la maniere de recuperer les globals ?
    -->>
    $NOM = isset($_POST['NOM']) ? $_POST['NOM'] : '';


  • avatar

    Mygale

    28 Oct 2007 à 15:13

    Bonjour à tous,
    J'espère que quelqu'un pourra m'aider au sujet de ce script car chez moi il ne fonctionne pas. J'ai aussi essayé avec les sessions et le passage des variables dans l'URL rien n'y fait j'ai toujour la même erreur :

    Au secours...

    J'ai une saisie de critères par un formulaire POST qui me rends
    $_POST['NOM']
    $_POST['DISPONIBILITE']
    $_POST['FAMILLE']
    Ce formulaire appelle une page affiche_critères1.php
    Dont le rôle est de traiter les options, envoyer la requête et faire afficher les données.
    Je voudrais les faire afficher page par page. Le premier affichage avec la limite ici de 4 fonctionne très bien. Aussitôt que je clique sur le lien suivant j'ai la catastrophe
    Notice: Undefined index: NOM in C:\Program Files\EasyPHP 2.0b1
    Notice: Undefined index: DISPONIBLE in C:\Program Files\EasyPHP 2.0b1
    Notice: Undefined index: FAMILLE in C:\Program Files\EasyPHP 2.0b1

    Je précise que la CASSE est bonne que le var_dump($_POST) me rend les bonnes valeur.

  • avatar

    MastaP

    03 Avril 2007 à 00:57

    Merci pour l'info, c'est les vacances donc on ne test pas tout. J'ai mis une mention tout en haut pour signaler que ce script n'est pas gratuit et je me suis servi de ton message pour indiquer les différents paliers de paiement. Ca reste exceptionnel que l'on garde de tel script je vous rassures.

  • avatar

    Immo

    02 Avril 2007 à 18:32

    faut renommer le dossier personnalisation en _personalisation

  • avatar

    MastaP

    08 Mars 2007 à 20:54

    L'utilisation de ce script développé en mode objet est très simple (il est avant tout destiné à des débutants et à des web designers qui ne sont pas des programmeurs) :

    Vous pouvez l'utiliser aussi bien dans des pages PHP statiques ou dynamiques que dans de simples pages HTML (en mode Ajax).

    Le manuel d'utilisation détaille aussi bien l'implémentation sur votre serveur que son utilisation dans les différentes pages de votre site web.

    Il y a par ailleurs plusieurs exemples d'utilisation en code source et commentés.

    Bonne lecture du manuel qui est véritablement destiné à des débutants (avec un bon nombre de captures d'écrans).

  • avatar

    KOogar

    27 Nov 2005 à 04:24

    bonjour,je les telecharger il fonctionne super part contre ya pas moyen d'avoir une traduction en francais

  • avatar

    Philippe_jmh

    11 Nov 2005 à 12:36

    Oui tu peux c'est un langage php souple si familiariser avec le javascript

  • avatar

    Laurent

    29 Oct 2005 à 06:18

    Undefined variable: debut... ben defini la variable en début de script !!

  • avatar

    Kimble

    28 Oct 2005 à 18:13

    Bonjour,
    J'ai une erreur sur la ligne:
    if($debut==""){$debut=0;}
    Notice: Undefined variable: ... on line 9
    Une solution ? merci

  • avatar

    Lanner

    25 Oct 2005 à 13:45

    bon a priori un collegue a réussi , cependant il y a une amélioration a faire mais je vois pas , car si par exemple il y a moins de 4 enregistrements il affiche quand meme PRECEDENT 1 - 2 - 3 - 4 SUIVANT comment régler ce probleme merci d'avance



 Autres snippets qui pourraient vous intéresser

Pagination PDO

Compatibilité : PHP 5, PHP 7, PHP 8

Le code doit être adapté à vos besoins, il suffit de changer quelques variables pour l'adapter à vos besoins. Code testé sur Wamp et chez OVH

Pagination basique I MySQL

Compatibilité : PHP 5, PHP 7, PHP 8

Affichage page par page basique avec exemple. En PHP et en MySQLi procédural. Tables SQL et connexion données dans l'exemple.

* Requêtes exécutées avec Recherche Contextuelle

  Les derniers scripts PHP / MySQL

Serendipity 2.6.0

logo Serendipity
Langue langue fr
Date  aujourd'hui
Taille 15 Mo
Catégorie Blogs

Drupal 11.3.6

logo Drupal
Langue langue us
Date  aujourd'hui
Taille 34 Mo
Catégorie CMS

TYPO3 14.2.0

logo TYPO3
Langue langue fr
Date  hier
Taille 38 Mo
Catégorie CMS

Dolibarr ERP 23.0.1

logo Dolibarr ERP
Langue langue fr
Date 09 Avril 2026
Taille 89 Mo
Catégorie Logiciels

ZwiiCampus 3.7.00

logo ZwiiCampus
Langue langue fr
Date 09 Avril 2026
Taille 11 Mo
Catégorie Administration

Craft CMS 5.9.19

logo Craft CMS
Langue langue fr
Date 08 Avril 2026
Taille 31 Mo
Catégorie CMS