Accueil
Cours

Pour notre exercice, nous allons utiliser une table assez simple.

Première étape : afficher tous les enregistrements dans une table HTML

Affichage des enregistrements dans une table HTML.

<html>
<body>
<?
// information pour la connection à le DB
// Nom du serveur , l'utilisateur de la BD , le mot de passe et enfin le nom de la base
$host 'localhost';
$user 'root';
$pass '';
$db '
CPIEtudiants';
//
Ouverture canal de connexion au serveur BD
$link mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
// connection à la DB
mysql_select_db($db) or die ('Erreur :'.mysql_error());
// requête SQL qui compte le nombre total d'enregistrement dans la table et qui
//récupère tous les enregistrements
$select 'SELECT prenom,surnom FROM
etudiants ';
$result mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total mysql_num_rows($result);
// La variable $result correspond à la structure d'un enregistrement de la table.
// si on a récupéré un résultat on l'affiche
, cad total different de zero.
if($total) {
    
// debut du tableau
    
echo '<table bgcolor="#FFFFFF">'."\n";
        
// première ligne on affiche les titres prénom et surnom dans 2 colonnes
        
echo '<tr>';
        echo 
'<td bgcolor="#669999"><b><u>Prénom</u></b></td>';
        echo 
'<td bgcolor="#669999"><b><u>Surnom</u></b></td>';
        echo 
'</tr>'."\n";
    
// lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    
while($row mysql_fetch_array($result)) {
    // boucle sur les lignes et pour chaque "row" prendre une info et l'afficher.
        echo 
'<tr>';
        echo 
'<td bgcolor="#CCCCCC">'.$row['prenom'].'</td>';
        echo 
'<td bgcolor="#CCCCCC">'.$row['surnom'].'</td>';
        echo 
'</tr>'."\n";
    }
    echo 
'</table>'."\n";
    
// fin du tableau.
}
else echo 
'Pas d\'enregistrements dans cette table...';
// on libère le résultat
mysql_free_result($result);
?>
</body>
</html>    

Le résultat de ce code donnera ceci à l'écran :
  Explications

Juste avant notre boucle, nous affichons une ligne de la table HTML.
Elle est constituée de 2 colonnes dans lesquelles nous mettons le titre de chacune d'elles sous cette forme :

Dans la boucle, nous allons afficher chaque enregistrement dans une ligne du tableau.
Le prénom dans une cellule et le surnom dans une autre, sous cette forme :

  CPI_ETUDIANT1

 

On désire afficher page par page de 5 enregistrements.

De quelles variables avons nous besoin ?

Pour notre affichage page par page, nous avons besoin de connaître certaines données que l'on va stocker dans des variables.
  • $nombre : Nombre d'enregistrements que l'on veut afficher par page.
  • $total : Le nombre total d'enregistrements de la table .
  • $limite : ou en sommes-nous dans notre affichage.

Nous allons reprendre notre script de base et y ajouter ce dont nous avons besoin pour travailler.
Au début du script nous allons initialiser les variables $nombre et $limite.

Initialisation des variables.

$nombre 5;  // on va afficher 5 résultats par page.
if (!$limite$limite 0// si on arrive sur la page pour la première fois 
              // on met limite à 0.
$path_parts pathinfo($PHP_SELF);
$page $path_parts["basename"];
Explications :
  • $nombre est initialisé à 5 (5 enregistrements affichés à la fois)
  • Si $limite n'existe pas on l'initialise à 0.
  • Les 2 lignes de codes suivantes permettent de récupérer le nom de la page qui sera utilisée dans les liens.
    La variable $total contient le nombre d'enregistrement à afficher au total.

Compte le nombre d'enregistrements total de la table.

$select 'SELECT count(id) FROM etudiants ';
$result mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$row mysql_fetch_row($result);
$total $row[0];

Ajout de la requête select avec le limit

Maintenant, nous avons besoin de faire notre requête de sélection qui va afficher $nombre enregistrements à partir de $limite.

Selectionne la portion d'enregistrements à afficher.

// requête SQL qui ne prend que le nombre d'enregistrement necessaire à l'affichage.
$select 'select prenom,surnom FROM etudiants  ORDER BY prenom ASC limit '.$limite.','.$nombre;
$result mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );

Explications

On utilise l'opérateur de concaténation pour compléter notre requête de base par le tri et la limite de sélection. Notre requête donnera donc au premier affichage de la page ($limite étant initialisé à 0 la première fois):

 Maintenant il faut gérer un bouton pour aller aux pages suivantes.

Imaginons que nous avons affiché la page pour la première fois. Notre $limite est à Zéro, et notre script affiche donc 5 enregistrements à partir du début.
C'est pas mal, mais maintenant il faut savoir s'il reste d'autres enregistrements à afficher.Si oui il nous faut mettre un lien ou un bouton permettant de les afficher.

Et pour cela, il faut recalculer la limite d'affichage.
Nous voulons afficher les $nombre enregistrements suivants et/ou les $nombre enregistrements précédents:
Il s'agit d'un calcul très simple :

Calcul des limites précédente et suivante

$limitesuivante $limite $nombre;
$limiteprecedente $limite $nombre;
Voilà à quoi notre requête SQL ressemblera si on est sur la première page et que l'on clique sur le lien suivant.

Pour avoir la limite d'affichage de la portion suivante, on ajoute $nombre à $limite
Pour avoir la limite d'affichage de la portion précédente, on retire $nombre à $limite

Affichage des boutons ou liens page précédente , page suivante

Maintenant, il va nous falloir afficher les liens ou les boutons pour afficher le reste des enregistrements.
Pour cela nous allons devoir réfléchir à 2 choses.
  • Sommes nous sur la première page de notre affichage ? C'est à dire est ce que $limite vaut 0 .
    • oui : il ne faut donc pas afficher de bouton ou de lien 'page précédente'.
    • non : il faut afficher un bouton ou un lien 'page précédente.

Affichage du lien précedent si besoin


if($limite != 0) {
    echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
}

 

Ou bien affichage d'un bouton formulaire


if($limite != 0) {
    echo '<form action="'.$page.'" method="post">';
    echo '<input type="submit" value="précédents">';
    echo '<input type="hidden" value="'.$limiteprecedente.'" name="limite">';
    echo '</form>';
}

  • Y a-t-il encore une page à afficher après la page courante? C'est à dire : est-ce que notre limite recalculée ($limitesuivante) est plus petite que notre $total ?
    • oui : il faut donc afficher un bouton ou un lien 'page suivante'.
    • non : il ne faut pas afficher de bouton ou de lien 'page suivante' car on est arrivé à la fin de notre affichage.

Affichage du lien suivant si besoin


if($limitesuivante $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante</a>';
}

 

Ou bien affichage d'un bouton formulaire

//Ou bien affichage d'un bouton formulaire 
if($limitesuivante $total) {
    echo '<form action="'.$page.'" method="post">';
    echo '<input type="submit" value="suivants">';
    echo '<input type="hidden" value="'.$limitesuivante.'" name="limite">';
    echo '</form>';                
}

Et voilà le tour est joué !

Maintenant, Si vous voulez afficher + de 5 enregistrements par page , il vous suffit de changer la valeur de $nombre.

On vérifie BD2.

<html>
<body>
<?
// information pour la connection à le DB
//=========================================
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'CPIEtudiants';
//=========================================
// connection à la DB
//=========================================
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());
$nombre = 5; // on va afficher 5 résultats par page.
if (!$limite) $limite = 0; // si on arrive sur la page pour la première fois
// on met limite à 0.

$path_parts = pathinfo($PHP_SELF);
$page = $path_parts["basename"];
$select = 'SELECT count(id) FROM etudiants ';
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];
//=========================================
//requête SQL qui compte le nombre total d'enregistrement dans la table
//récupère tous les enregistrements
//=========================================
// requête SQL qui ne prend que le nombre d'enregistrement necessaire à l'affichage.

$select = 'select prenom,nom FROM etudiants ORDER BY prenom ASC limit '.$limite.','.$nombre;
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
//Calcul des limites précédente et suivante
$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
if($limite != 0) {
echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
echo '<form action="'.$page.'" method="post">';
echo '<input type="submit" value="précédents">';
echo '<input type="hidden" value="'.$limiteprecedente.'" name="limite">';
echo '</form>';
}
if($limitesuivante < $total) {
echo '<a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante</a>';
echo '<form action="'.$page.'" method="post">';
echo '<input type="submit" value="suivants">';
echo '<input type="hidden" value="'.$limitesuivante.'" name="limite">';
echo '</form>';
}
//=========================================
// si on a récupéré un resultat on l'affiche.
//=========================================
if($total) {
// debut du tableau
echo '<table bgcolor="#FFFFFF">'."\n";
// première ligne on affiche les titres prénom et surnom dans 2 colonnes
echo '<tr>';
echo '<td bgcolor="#669999"><b><u>Prenom</u></b></td>';
echo '<td bgcolor="#669999"><b><u>NOM</u></b></td>';
echo '</tr>'."\n";
// lecture et affichage des résultats sur 2 colonnes
while($row = mysql_fetch_array($result)) {
echo '<tr>';
echo '<td bgcolor="#CCCCCC">'.$row['prenom'].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row['nom'].'</td>';
echo '</tr>'."\n";
}
echo '</table>'."\n";
}
else echo 'Pas d\'enregistrements dans cette table...';
mysql_free_result($result);
?>
</body>
</html>

Comment utiliser ce que nous venons d'apprendre de facon plus intelligente.

C'est l'utilisateur qui choisit le nombre de pages

Valider la $limite passée par l'url.

Comme pour tous les scripts, il est important de penser à la sécurité, particulièrement quand des variables sont passées par URL ou par un formulaire.
Nous devons tester si la valeur de $limite :

  • est bien numérique.
  • se trouve dans une fourchette de valeurs possibles (de 0 à $max)
  • est un multiple de $nombre.
Pourquoi faire tout ces tests ? Parce qu'il ne faut jamais faire confiance à l'utilisateur, ni aux données qu'il peut entrer dans un formulaire ou via l'URL !

Fonction qui vérifie la validité de $limite

function verifLimite($limite,$total,$nombre) {
    // je verifie si limite est un nombre.
    if(is_numeric($limite)) {
// si $limite est entre 0 et $total, $limite est ok
        // sinon $limite n'est pas valide.
        if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) {
            // j'assigne 1 à $valide si $limite est entre 0 et $max
            $valide 1;
        }    
        else {
            // sinon j'assigne 0 à $valide
            $valide 0;
        }
    }
    else {
            // si $limite n'est pas numérique j'assigne 0 à $valide
            $valide 0;
    }
// je renvois $valide
return $valide;
}

Explication des arguments passés en paramètres à la fonction verifLimite

  • $limite : la limite passée en paramètre.
  • $total : le nombre total d'enregistrements à afficher.
  • $nombre : nombre total d'enregistrements à afficher par page.

Fonction qui affiche les boutons précédent/suivant

<?
function displayNextPreviousButtons($limite,$total,$nb,$page) {
$limiteSuivante $limite $nb;
$limitePrecedente $limite $nb;
echo  '<table><tr>'."\n";
if($limite != 0) {
        echo  '<td valign="top">'."\n";
        echo  '<form action="'.$page.'" method="post">'."\n";
        echo  '<input type="submit" value="précédents">'."\n";
        echo  '<input type="hidden" value="'.$limitePrecedente.'" name="limite">'."\n";
        echo  '</form>'."\n";
        echo  '</td>'."\n";
}
if($limiteSuivante $total) {
        echo  '<td valign="top">'."\n";
        echo  '<form action="'.$page.'" method="post">'."\n";
        echo  '<input type="submit" value="suivants">'."\n";
        echo  '<input type="hidden" value="'.$limiteSuivante.'" name="limite">'."\n";
        echo  '</form>'."\n";
        echo  '</td>'."\n";
            
}
echo  '</tr></table>'."\n";
}

Explication des arguments passés en paramètres à la fonction displayNextPreviousButtons.

  • $limite : la limite d'affichage courante.
  • $total : nombre total d'enregistrements retournés par le query
  • $nb : nombre d'enregistrements à afficher par page.
  • $page : nom de la page php.

Explication de la fonction displayNextPreviousButtons.

Elle se comporte exactement comme les bouts de script expliqués ci-dessus.
On calcule la limite précédente et suivante, et, selon la page sur laquelle on se trouve ainsi que le nombre d'enregistrements total à afficher, on affiche ou pas les boutons next/previous.

Comment afficher les numéros de page.

Vous vous demandez surement comment faire pour afficher des liens vers les différents pages à afficher.
Cette petite fonction va vous aider.

Fonction qui affiche les liens vers les pages

function affichePages($nb,$page,$total) {
        $nbpages=ceil($total/$nb);
        $numeroPages 1;
        $compteurPages 1;
        $limite  0;
        echo '<table border = "0" ><tr>'."\n";
        while($numeroPages <= $nbpages) {
        echo '<td ><a href = "'.$page.'?limite='.$limite.'">'.$numeroPages.'</a></td>'."\n";
        $limite $limite $nb;
        $numeroPages $numeroPages 1;
        $compteurPages $compteurPages 1;
            if($compteurPages == 10) {
            $compteurPages 1;
            echo '<br>'."\n";
            }
        }
        echo '</tr></table>'."\n";
}

Explication des arguments passés en paramètres à la fonction affichePages

  • $nb : $nb : nombre d'enregistrements à afficher par page.
  • $page : nom de la page php.
  • $total : nombre total d'enregistrements retournés par le query

Explication de la fonction affichePages.

  1. On calcule le nombre de pages en divisant le nombre total d'enregistrements (retournés par le query) par le nombre d'enregistrements à afficher par page.

    Si nous avons 20 enregistrements à afficher il nous faudra 20/5 = 4 pages. Si nous avons 21 enregistrements à afficher , comme 21/5 =4,2,cinq pages seront nécessaires. On doit donc arrondir à l'entier supérieur gr?ce à la fonction ceil();

  2. On initialise $numeroPages à 1 (première page)
  3. On fait une boucle qui va faire varier $numeroPages tant qu'il est inférieur ou égal à $nbpages.
  4. A chaque passage dans la boucle, on incrémente $numeroPages.
  5. Pour ne pas se retrouver avec trop de numéros de pages sur la même ligne, on met en place un compteur $compteurPages qui va varier dans la boucle lui aussi.
  6. Une fois que sa valeur arrivera à 10, on ajoute un retour à la ligne et on remet notre compteur à 1.
Modification de notre script de base afin qu'il utilise nos 2 nouvelles fonctions.
Si le nombre total d'enregistrements à afficher est plus grand que le nombre d'enregistrements à afficher par page, on appelle la fonction qui affiche les numéros de page ainsi que celle qui affiche les boutons

Modification du script de base pour utiliser nos 2 fonctions

<html>
<body>
<?
//=========================================
// includes du fichier fonctions
//=========================================
require 'fonctions.php';
//=========================================
// information pour la connection à le DB
//=========================================
$host 'localhost';
$user 'root';
$pass '';
$db 'test';
//=========================================
// initialisation des variables 
//=========================================
// on va afficher 5 résultats par page.
$nombre 5;  
// si limite n'existe pas on l'initialise à Zéro
if (!$limite$limite 0// on cherche le nom de la page.    
$path_parts pathinfo($PHP_SELF);
$page $path_parts["basename"];
//=========================================    
// connection à la DB
//=========================================
$link mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());
//=========================================    
// requête SQL qui compte le nombre total 
// d'enregistrement dans la table.
//=========================================
$select 'SELECT count(nom) FROM etudiants ';
$result mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$row mysql_fetch_row($result);
$total $row[0];
    
//=========================================
// vérifier la validité de notre variable 
// $limite;
//=========================================
$verifLimiteverifLimite($limite,$total,$nombre);
// si la limite passée n'est pas valide on la remet à Zéro
if(!$verifLimite)  {
    $limite 0;
}
//=========================================
// requête SQL qui ne prend que le nombre 
// d'enregistrement necessaire à l'affichage.
//=========================================
$select 'select prenom,surnom FROM etudiants  ORDER BY prenom ASC limit '.$limite.','.$nombre;
$result mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
//=========================================    
// si on a récupéré un resultat on l'affiche.
//=========================================
if($total) {
    // debut du tableau
    echo '<table bgcolor="#FFFFFF">'."\n";
        // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr>';
        echo '<td bgcolor="#669999"><b><u>Prénom</u></b></td>';
        echo '<td bgcolor="#669999"><b><u>Surnom</u></b></td>';
        echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes    
   while($row mysql_fetch_array($result)) {
        echo '<tr>';
        echo '<td bgcolor="#CCCCCC">'.$row['prenom'].'</td>';
        echo '<td bgcolor="#CCCCCC">'.$row['surnom'].'</td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
}
else echo 'Pas d\'enregistrements dans cette table...';
mysql_free_result($result);
//=========================================    
// si le nombre d'enregistrement à afficher 
// est plus grand que $nombre 
//=========================================
if($total $nombre) {
    // affichage des liens vers les pages
    affichePages($nombre,$page,$total);
    // affichage des boutons
    displayNextPreviousButtons($limite,$total,$nombre,$page);
}
?>
</body>
</html>

Que pourriez-vous ajouter?

  • Signaler sur quelle page l'utilisateur se trouve.
    "vous êtes sur la page n°1","vous êtes sur la page n°2",...
  • Changer la couleur du numéro de page active.
  • Afficher où on en est dans l'affichage des enregistrements :
    Affichage des 5 premiers enregistrements sur / 32.
    Affichage des 10 premiers enregistrements sur / 32.
    etc...
Envoyez un courrier électronique à Philippe Bancquart pour toute question ou remarque concernant ce site Web.