Créer un système de pagination

La pagination (afficher des informations sur plusieurs pages) permet de faciliter la navigation et d'économiser les ressources systèmes.
Nous allons voir ici comment faire un système de pagination facilement.

Mais quelle est vraiment l'utilité d'un tel système ?

Imaginons que vous avez une page qui liste des informations récupérées de la Base de Données (c'est le cas des pages blog et liens sur Seebz.net).

Lorsque la liste est courte, il n'y a pas de problème: les informations sont facilement accessibles et les requêtes ne sont pas lourdes pour le système.

Mais où cela devient un problème, c'est lorsque la liste commence à devenir plus longue, le visiteur se retrouve alors face à pleins d'information et il lui est difficile de retrouver ce qu'il cherche.
De même, le système peut surcharger car il doit gérer plein d'enregistrement d'un coup.

Votre code (sans pagination)

Le code source de votre page ressemble grossièrement à ceci :

<?php

// Requête SQL
$sql = 'SELECT * FROM table';
$resultat = mysql_query($sql);

// Traitement et affichage des données
while ( $donnee = mysql_fetch_assoc($resultat) ) {
    echo $donnee['champ'];
}

?>

Les modifications à faire

Afin de créer notre système de pagination, nous avons besoin :

  • du nombre d'informations qui seront affichées par page,
    Nous appellerons cette variable $pagination et elle aura toujours la même valeur (10 dans l'exemple).

  • du numéro de la page en cours,
    Ce paramètre sera donné via l'URL (par exemple index.php?page=2)

  • connaître le nombre total d'informations contenues dans la base de données,
    Une requête SQL nous aidera à y parvenir

  • de modifier notre requête SQL,
    Afin de ne récupérer que les 10 informations demandées (à l'aide de la commande LIMIT)

  • de créer le code (x)html,
    Les liens vers les autres pages

On commence

Nous allons commencer par récupérer le numéro de la page en cours.
Pour rappel, ce paramètre vient de l'URL ( index.php?page=X ) :

// Numero de page (1 par défaut)
if( isset($_GET['page']) && is_numeric($_GET['page']) )
    $page = $_GET['page'];
else
    $page = 1;

Ensuite, nous devons préparer notre requête SQL.
Nous devons donc calculer à partir de quel id récupérer les informations :

// Nombre d'infos par page
$pagination = 10;
// Numéro du 1er enregistrement à lire
$limit_start = ($page - 1) * $pagination;

// Préparation de la requête
$sql = "SELECT * FROM table LIMIT $limit_start, $pagination";

Vient ensuite le code normal de la page (celui qui avait avant, sans pagination, excepté la commande SQL) :

// Requête SQL
$resultat = mysql_query($sql);

// Traitement et affichage des données
while ( $donnee = mysql_fetch_assoc($resultat) ) {
    echo $donnee['champ'];
}

Nous avons besoin de compter le nombre d'enregistrements contenus dans la BD.

// Nb d'enregistrement total
$nb_total = mysql_query('SELECT COUNT(*) AS nb_total FROM table');
$nb_total = mysql_fetch_array($nb_total);
$nb_total = $nb_total['nb_total'];

Nous pouvons maintenant écrire le système de pagination (les liens des autres pages) :

// Pagination
$nb_pages = ceil($nb_total / $pagination);

echo '<p>[ Page :';
// Boucle sur les pages
for ($i = 1 ; $i <= $nb_pages ; $i++) {
    if ($i == $page )
        echo " $i";
    else
        echo " <a href=\"?page=$i\">$i</a> ";
}
echo ' ]</p>';

Et voilà

Vous avez maintenant un beau système de pagination tel que celui sur Seebz.net.

Vous pouvez bien entendu l'adapter car il est assez simpliste. J'ai du volontairement omettre certaines explications vu la longueur de l'article mais je suis sur que vous n'aurez pas de mal à comprendre le principe de ce code.

Un petit résumé pour vous faciliter le copier-coller ;)

<?php

// Numero de page (1 par défaut)
if( isset($_GET['page']) && is_numeric($_GET['page']) )
    $page = $_GET['page'];
else
    $page = 1;

// Nombre d'info par page
$pagination = 10;
// Numéro du 1er enregistrement à lire
$limit_start = ($page - 1) * $pagination;

// Préparation de la requête
$sql = "SELECT * FROM table LIMIT $limit_start, $pagination";

// Requête SQL
$resultat = mysql_query($sql);

// Traitement et affichage des données
while ( $donnee = mysql_fetch_assoc($resultat) ) {

    /* ICI VOTRE CODE NORMAL */
    /* Affichage d'un élément */

}

// Nb d'enregistrement total
$nb_total = mysql_query('SELECT COUNT(*) AS nb_total FROM table');
$nb_total = mysql_fetch_array($nb_total);
$nb_total = $nb_total['nb_total'];

// Pagination
$nb_pages = ceil($nb_total / $pagination);

echo '<p>[ Page :';
// Boucle sur les pages
for ($i = 1 ; $i <= $nb_pages ; $i++) {
    if ($i == $page )
        echo " $i";
    else
        echo " <a href=\"?page=$i\">$i</a> ";
}
echo ' ]</p>';

?>

J'admets que cet article est (un peu) long mais c'est aussi ça les joies de la programmation :p
Suite au prochain numéro

comments powered by Disqus