Pagination classique

      Information sur le code

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

55 975  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    
                               
/*------------------------------*/
/*
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    
                                            

<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.

[PHP/SQL] Script de pagination (un modèe) - PHP Sources

Compatibilité : PHP 4, PHP 5

Script de pagination en PHP avec 2 requêtes SQL. Caractéristiques : - deux paramétres dans l'URL : nombre d'éléments par page et page actuelle

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

  Les derniers scripts PHP / MySQL

ZwiiCMS 14.1.06

logo ZwiiCMS
Langue langue fr
Date  hier
Taille 8 Mo
Catégorie CMS

WAMP 3.3.0 x32

logo WAMP
Langue langue fr
Date  hier
Taille 327 Mo
Catégorie Wamp

TYPO3 14.1.1

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

SuiteCRM 8.9.3

logo SuiteCRM
Langue langue en
Date  hier
Taille 112 Mo
Catégorie CRM

SPIP 4.4.13

logo SPIP
Langue langue fr
Date  hier
Taille 9 Mo
Catégorie CMS

RosarioSIS 12.7.5

logo RosarioSIS
Langue langue fr
Date  hier
Taille 10 Mo
Catégorie Administration