Pagination - XwZ

La pagination c'est quoi, c'est la méthode utilisé pour afficher tous les résultats d'une requête sur plusieurs pages, pour éviter les chargements de page trop long par exemple.
Bon ici je vais utiliser une méthode, mais c'est pas la seule qui existe, la seul chose qui changera sur les différents scripts ou tutoriaux sera le calcul mathématiques.
Tout d'abord, on va créer une table de test, on va en faire une simple :
CREATE TABLE `pagination` (
`id` INT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titre` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM 

maintenant entrons quelques lignes, pour ne pas mettre des valeurs au hasard qui se ressembeleraient toutes, je vais prendre les nom des 20 derniers film du moment.
Voici le code de l'insertion
INSERT INTO `pagination` (
`id` ,
`titre`
)
VALUES (
NULL , 'Ratatouille'
),(
NULL , 'Tel père, telle fille'
), (
NULL , 'Mi$e à prix Mi$e à prix'
), (
NULL , 'Motel'
), (
NULL , 'Fido'
), (
NULL , 'Interview'
), (
NULL , 'Pathfinder'
), (
NULL , 'Ce que je sais de Lola'
), (
NULL , 'Roger et moi'
), (
NULL , 'Dreamland'
);


Avant de savoir combien il y a de page il faut savoir combien il y a d'enregistrement, pour ça il faut faire une requète toute bête, lç voici :
$sql_nombre_de_lignes = mysql_query ( "SELECT `id` FROM `pagination`" ) ;
$nombre_de_lignes = mysql_num_rows ( $sql_nombre_de_lignes ) ;


Maintenant il faut savoir combien de lignes vous souhitez afficher sur les pages. Je prendrais 3 pour ne pas avoir de compte rond.
Voici comment on peut récupérer le nombre de page dont on a besoin pour afficher tous les enregistrements (je créer une fonction pour que ce soit plus simple à réutiliser) :
function nombrePages ( $nombre_total_de_lignes, $nombre_de_ligne_par_page )
{
    // On crait un petit glossaire pour savoir à quoi servent les variables (pas obligatoire mais conseillé)
    $reste = ''; // Va contenir le reste de la division entière
    $nombre_pages = ''; // Va contenir le quotient de la division entière

    // On récupère le reste de la division entière grâce à l'opérateur modulo (%)
    $reste = $nombre_total_de_lignes % $nombre_de_ligne_par_page ;

    // On fait la division entière pour ça il nous faut utiliser la fonction floor
    $nombre_pages = floor ( $nombre_total_de_lignes / $nombre_de_ligne_par_page ) ;

    // Donc le nombre minimum de page est $nombre_pages , +1 si le reste de la division entière est non nul, différent de 0, si tel est le cas on ajoute un à $nombre_pages
    if ( $reste != 0 )
    {
        $nombre_pages += 1 ;
    }

    // Maintenant que l'on connait le nombre de page on a plus qu'à le retourner
    return ( $nombre_pages ) ;
}
// On récupère le nombre de page qu'il faut pour afficher tous les enregistrements avec 3 enregistrement par page
$nombre_page = nombrePages ( $nombre_de_lignes, 3 ) ;


Bon maintenant nous allons nous servir de ce nombre, il faut bien qu'il serve ...
Nous allons donc faire une deuxième requète qui ne récupère que les enregistrements qui correspondent à notre page, pour cela il faut dabord savoir sur quelle page nous sômmes alors voila comment faire :
// On vérifie si le numéros de la page est spécifié dans l'url
if ( true === isset ( $_GET [ 'page' ] ) )
{
    // Si il bien dans l'url on vérifie que ce soit bien un nombre
    if ( true === is_numeric ( $_GET [ 'page' ] ) )
    {
        // On l'enregistre dans la variable $numero_page
        $numero_page = $_GET [ 'page' ] ;
    }
    else
    {
        // Sinon on se place sur la première page
        $numero_page = 1 ;
    }
}
else
{
    // Si le numéro de la page n'est pas spécifié dans l'url alors on se place sur la première page
    $numero_page = 1 ;
}


Maintenant il nous faut savoir à quel numéro de ligne cela nous amène, pour ça nous allons mettre le numéro du première enregistrement de la page (en sachant que le premier de la première page est 0) :
    $numero_premier_enregistrement = $numero_page * 3 - 3 // Si $numero_page == 1, $numero_premier_enregistrement = 0, soit 1 * 3 - 3 = 0


Bien maintenant il nous reste à faire cette fameuse requête qui va nous récupérer les bon enregistrements :
$sql_enregistrements = mysql_query ( "SELECT `titre` FROM `pagination` ORDER BY `titre` ASC LIMIT " . $numero_premier_enregistrement . ", 3" ) ;

Besoin d'une explications sur cette requête peut-être ? Les voila :
ORDER BY nom ASC permet de classer les noms de film par ordre alphabétique
LIMIT $numero_premier_enregistrement, 3 permet de récupérer 3 enregistrements à partir de la ligne $numero_premier_enregistrement.

Bon il est peut-être temps de montrer à l'utilisateur les films de la semaine :).
Voila le code :
echo '<ul>' . "\n" ; // <ul> balise annoçant le début d'une liste
while ( $tableau_enregistrement = mysql_fetch_assoc ( $sql_enregistrements ) )
{
    echo '    <li>' . $tableau_enregistrement['titre'] . '</li>' . "\n" ; // <li> et </li> délimitant une ligne de la liste
}
echo '</ul>' ; // </ul> balise annonçant la fin de la liste

Bon si vous en êtes à ce tutorial vous ne devriez pas avoir de mal à comprendre ce qui vient de ce passer. Pour les petits malins qui brulent les étapes voila ce qui vient de ce passer :
On lit une par une toutes les lignes récupéraient par la requête en même temps on enregistre dans le tableau $tableau_enregistrement les champs selectionné dans la requêtes (liste de champs ce situant entre SELECT et FROM) et on affiche enfin le nom du film.

Bon voila ... là on a presque finit me direz-vous ... mais non, il nous reste deux ou trois choses à régler encore, comme la création de la fonction qui affiche le numéro des pages sous forme de liens, la voila je vous la donne, elle est toute simple :
function listePages ( $nombre_pages )
{
    $separateur = '' ;
    for ( $i = 1; $i <= $nombre_pages; $i++ )
    {
        echo $separateur . '<a href="ma_page.php?page=' . $i . '">Page ' . $i . '</a>' ;
        $separateur = ' | ' ;
    }
}

Voila, maintenant pour l'utiliser il faut récupérer le nombre de page il y a, on réutilise la variable $nombre_page de tout à l'heure.
listePages ( $nombre_page ) ;

Voila là on a les pages avec leur numéro d'afficher.

Et enfin pour finir, on va parler d'un petit problème qui se pose, c'est si l'utilisateur modifie la valeur du numéro de la page dans l'url, il risque de nous créer des problèmes, si il donne un numéro de page qui n'existe pas on va avoir une erreur au niveau du while. pour cela il faut modifier la condition de tout à l'heure, pour vérifier que le numéro de la page récupérait est bien compris entre 1 et $nombre de page.
Voici la condition "sécurisé" :
// On vérifie si le numéros de la page est spécifié dans l'url
if ( true === isset ( $_GET [ 'page' ] ) )
{
    // Si il bien dans l'url on vérifie que ce soit bien un nombre
    // et si il est bien entre 1 et $nombre_page
    if ( true === is_numeric ( $_GET [ 'page' ] ) && 1 <= $_GET [ 'page' ] && $nombre_page >= $_GET [ 'page' ] )
    {
        // On l'enregistre dans la variable $numero_page
        $numero_page = $_GET [ 'page' ] ;
    }
    else
    {
        // Sinon on se place sur la première page
        $numero_page = 1 ;
    }
}
else
{
    // Si le numéro de la page n'est pas spécifié dans l'url alors on se place sur la première page
    $numero_page = 1 ;
}


Et pour finir ce long tutorial, en bonus, le code de la page complet :
<?php
    // Information sur la configuration du serveur MySQL
    // Ici configuration de base en local
    $serveur = 'localhost' ;
    $utilisateur = 'root' ;
    $mot_de_passe = '' ;

    // Nom de la base de donnée
    $base_de_donnee = 'test' ;

    // Connexion au serveur MySQL
    mysql_connect ( $serveur, $utilisateur, $mot_de_passe ) ;

    // Connexion à la base de donnée
    mysql_select_db ( $base_de_donnee ) ;

    // On définit les fonctions
    function nombrePages ( $nombre_total_de_lignes, $nombre_de_ligne_par_page )
    {
        // On crait un petit glossaire pour savoir à quoi servent les variables (pas obligatoire mais conseillé)
        $reste = ''; // Va contenir le reste de la division entière
        $nombre_pages = ''; // Va contenir le quotient de la division entière

        // On fait la division entière grâce à l'opérateur modulo (%)
        $reste = $nombre_total_de_lignes % $nombre_de_ligne_par_page ;

        // On fait la division entière pour ça il nous faut utiliser la fonction floor
        $nombre_pages = floor ( $nombre_total_de_lignes / $nombre_de_ligne_par_page ) ;

        // Donc le nombre minimum de page est $nombre_pages , +1 si le reste de la division entière est non nul, différent de 0, si tel est le cas on ajoute un à $nombre_pages
        if ( $reste != 0 )
        {
            $nombre_pages += 1 ;
        }

        // Maintenant que l'on connait le nombre de page on a plus qu'à le retourner
        return ( $nombre_pages ) ;
    }

    function listePages ( $nombre_pages )
    {
        $separateur = '' ;
        for ( $i = 1; $i <= $nombre_pages; $i++ )
        {
            echo $separateur . '<a href="ma_page.php?page=' . $i . '">Page ' . $i . '</a>' ;
            $separateur = ' | ' ;
        }
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <title>Liste de 10 films sortie au cinéma le 1 Août 2007</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
        <?php
            // Le glossaire
                // Variables
                $nombre_page = '' ; // Recevra le nombre de page totale
                $numero_page = '' ; // Recevra le numéro de la page
                $sql_nombre_de_lignes = '' ; // Recevra le résultat de la requête qui récupère tout les enregistremente de la table
                $nombre_de_lignes = '' ; // Recevra le nombre d'enregistrement présent dans la table
                $numero_premier_enregistrement = '' ; // Recevra le numéro du premier enregistrement de la page en cour
                $sql_enregistrements = '' ; // Recevra le résultat de la requête ne selectionnant que les enregistrements à afficher sur la page

                // Constantes
                $nombre_enregistrement_par_page = 3 ; // C'est le nombre d'enregistrement à afficher par page
         ?>
    </head>
    <body>

        Voici la liste :
        <?php
            $sql_nombre_de_lignes = mysql_query ( "SELECT `id` FROM `pagination`" ) ;
            $nombre_de_lignes = mysql_num_rows ( $sql_nombre_de_lignes ) ;
            $nombre_page = nombrePages ( $nombre_de_lignes, $nombre_enregistrement_par_page ) ;

            // On vérifie si le numéros de la page est spécifié dans l'url
            if ( true === isset ( $_GET [ 'page' ] ) )
            {
                // Si il bien dans l'url on vérifie que ce soit bien un nombre
                if ( true === is_numeric ( $_GET [ 'page' ] ) && 1 <= $_GET [ 'page' ] && $nombre_page >= $_GET [ 'page' ] )
                {
                    // On l'enregistre dans la variable $numero_page
                    $numero_page = $_GET [ 'page' ] ;
                }
                else
                {
                    // Sinon on se place sur la première page
                    $numero_page = 1 ;
                }
            }
            else
            {
                // Si le numéro de la page n'est pas spécifié dans l'url alors on se place sur la première page
    $numero_page = 1 ;
            }

            $numero_premier_enregistrement = $numero_page * $nombre_enregistrement_par_page - $nombre_enregistrement_par_page ; // Si $numero_page == 1, $numero_premier_enregistrement = 0, soit 1 * $nombre_enregistrement_par_page - $nombre_enregistrement_par_page = 0

            $sql_enregistrements = mysql_query ( "SELECT `titre` FROM pagination ORDER BY `titre` ASC LIMIT " . $numero_premier_enregistrement . ", " . $nombre_enregistrement_par_page ) ;

            echo '<ul>' . "\n" ; // <ul> balise annoçant le début d'une liste
            while ( $tableau_enregistrement = mysql_fetch_assoc ( $sql_enregistrements ) )
            {
                echo '    <li>' . $tableau_enregistrement['titre'] . '</li>' . "\n" ; // <li> et </li> délimitant une ligne de la liste
            }
            echo '</ul>' ; // </ul> balise annonçant la fin de la liste
            listePages ( $nombre_page ) ;
        ?>
    </body>
</html>     


Voila vous savez faire un système de pagination, n'hésitez pas à venir sur le forum en cas de problème.



Les commentaires :


:) - Le 06/08/2007 à 22:17:42
il marche super bien ton script, j'aurais aimé le voir en couleur mdrrr
avatar boulvail
inscrit le : 04-08-2007

Page chargée en 177,631 ms