Comment créer un système de pagination avec les sessions PHP ?

Réponses rédigées par Antoine
Dernière mise à jour : 2022-10-19 19:13:17
Thèmes : php - array - session - pagination
Question

Bonjour,

J'aimerai que la page qui est lue rentre dans un array.

$_SESSION['TabSuivant'][]=$_SERVER['REQUEST_URI'];

Puis l 'user en faisant suivant la nouvelle page rentre dans le même array, et que la page précédent passe dans un autre array.

$_SESSION['TabRetour'][] = array_pop($_SESSION['TabSuivant']);

Jusque là c'est bon.

Quand l'user fait précédent cela va lire la dernière valeur de l'array $_SESSION['TabRetour'][] L'user arrive donc à la page précédente.

<?PHP
function precedent(){
    $_SESSION['TabRetour'][] = array_pop($_SESSION['TabSuivant']);
    $_SESSION['TabSuivant'][]= $_SERVER['REQUEST_URI'];
    $_SESSION['Precedent']= end ($_SESSION['TabRetour']);
   
echo "<br/>Page lue<br/>".var_dump($_SESSION['TabRetour'])."<br/>";
   echo "<br/>Page actuelle<br/>".var_dump($_SESSION['TabSuivant'])."<br/>";
   echo "<br/>Page bouton précédent<br/>".$_SESSION['Precedent']."<br/>";
}
?>

Et l'array retour doit perdre sa dernière valeur.

<?PHP
function Retour(){
    $_SESSION['PrecedentRetour'] = array_pop($_SESSION['TabRetour']);

echo "<br/>Array suite au retour <br/>".$_SESSION['PrecedentRetour']."<br/>";
}
?>

MAIS C'EST ICI QUE CELA SE COMPLIQUE. Dans le bouton précédent en cas de retour sur une page, on arrive bien à la page précédente, mais si on fait précédent de nouveau sur cette page cela nous renvoi sur la page suivante, cela tourne en boucle. Voici le code du bouton dans le footer.

<div id="precedent">
<form>
        <?php
        precedent();
?>
<button type="submit"><a href="<?PHP print_r($_SESSION['precedent']);?>">Précédent</a></button>
</form>
</div>

Merci pour votre aide.

Réponse

Bonjour,

Tout en utilisant les sessions PHP, vous créez un tableau multidimensionnel où vous stockez les URL avec leur ordre d'entrée dans le tableau.

Il suffit ensuite d'utiliser les fonction PHP array_search() et array_column() pour récupérer les url et leur ordre d'entrée dans le tableau, ce qui permet de générer une pagination dynamique.

Pour tester le script suivant, collez le code PHP dans une page test.php et allez à l'url test.php?toto=1, puis test.php?toto=2, puis test.php?toto=3.

<?php
// On affiche les erreurs car on est pas en production
error_reporting(E_ALL);
ini_set("display_errors", 1);
// On intitialise les sessions
session_start();
// On déclare les variables
$pagination = "";
// Fonction qui génère la pagination
function affichageNavigation($ordre) 
{
 $pagination = "";
 if ($ordre > 0) 
 {
  $ordre_precedent = array_search($ordre, array_column($_SESSION['pagination'], 'ordre')) - 1;
  $url_precedent = array_column($_SESSION['pagination'], 'url')[$ordre_precedent];
  $pagination .=  "<a href='".$url_precedent."'>Précédent</a>";
 }
 if (($ordre < max(array_column($_SESSION['pagination'], 'ordre'))) && ($ordre >= "0"))
 {
  $ordre_suivant = array_search($ordre, array_column($_SESSION['pagination'], 'ordre')) + 1;
  $url_suivant = array_column($_SESSION['pagination'], 'url')[$ordre_suivant];
  $pagination .=  " - <a href='".$url_suivant."'>Suivant</a>";
 }
 return $pagination;
}
// Si la session n'existe pas on la crée et on y insère un tableau multidimensionnel [url, ordre=0]
if (!isset($_SESSION['pagination']))
{
 $tableau = ["url" => "".$_SERVER['REQUEST_URI']."", "ordre" => "0"]; 
 $_SESSION['pagination'] = array($tableau);
}
// Si la session existe et que l'url n'est pas encore dans le tableau on l'ajoute  [url, ordre=ordre+1]
// Si c'est une URL qui est déja dans le tableau, on récupère son ordre.
// On appel la fonction qui génère la navigation.
else if (isset($_SESSION['pagination']))
{
 if (array_search($_SERVER['REQUEST_URI'], array_column($_SESSION['pagination'], 'url')) === FALSE) 
 {
  $ordre_suivant = max(array_column($_SESSION['pagination'], "ordre")) + 1;
  $tableau = ["url" => "".$_SERVER['REQUEST_URI']."", "ordre" => "".$ordre_suivant.""];
  array_push($_SESSION['pagination'], $tableau);
  $pagination = affichageNavigation($ordre_suivant);
 }
 else
 {
  $ordre = array_search($_SERVER['REQUEST_URI'], array_column($_SESSION['pagination'], 'url'));
  $ordre = array_search($ordre, array_column($_SESSION['pagination'], 'ordre'));
  $pagination = affichageNavigation($ordre);
 }
}

echo $pagination;
echo "<br>";
echo "<pre>"; 
print_r($_SESSION['pagination']);
echo "</pre>";
?>

En outre ce type de pagination basée sur les sessions PHP peut poser problème lors de l'expiration des sessions.