JeuWeb - Crée ton jeu par navigateur
Pagination - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Pagination (/showthread.php?tid=6901)



Pagination - hercull - 22-05-2014

Bonjour,

Je créer actuellement un système de pagination en php et je rencontre un soucis, lorsque je dois faire un pagination ou la requête SQL est en dur pas de probleme cela fonctionne,
mais lorsque je dois faire la même pagination après une fonction de recherche sa se corse un peu, car la requête est dynamique.

La ou je bute, c'est lors du clic sur le lien pour aller à la page 2 par exemple:

Code :
<a href="recherche.php?page='.$pagin_pos.'">2</a>

Quand je clic sur le lien cela m’amène bien à la page 2 mais les résultats sont ceux de la page 1, idem pour la page 3,4...

Ou est ce que j'ai fait une erreur? qu'est ce qui diffère d'une pagination avec requête fixe?

Merci.


RE: Pagination - Xenos - 22-05-2014

Salut,

sans voir la requête fixe, ni même ce que tu appelle la "requête dynamique", cela va être très difficile de t'aider !
Peux-tu nous détailler la requête et le morceau de code PHP qui devrait s'occuper de la pagination?


RE: Pagination - hercull - 23-05-2014

J’hésite à vous poster mon code car c'est un sacré morceau, mais si c'est le seul moyens pour m’aider je le fais, je vais tenter de le mettre d'une façon clair, seulement certains noms de variable n'ont rien avoir avec le réelle sens car je réutilise beaucoup mon code:

Code pagination avec requête en dur (qui fonctionne ):

------------------------------------------------------
Début code pagination:

Code :
$articleParPage=9;

    $req_utilisateurs = mysql_query('SELECT COUNT(*) AS total FROM article WHERE categorie = "pinceaux_accessoires" AND sous_categorie = "levres_pa" AND disponible = 1');
    $rep_utilisateurs = mysql_fetch_assoc($req_utilisateurs);
    $total_utilisateurs = $rep_utilisateurs['total'];
    
$nombreDePages=ceil($total_utilisateurs/$articleParPage);

if(isset($_GET['page']))
{
     $pageActuelle=intval($_GET['page']);

     if($pageActuelle>$nombreDePages)
     {
          $pageActuelle=$nombreDePages;
     }
}
else
{
     $pageActuelle=1;    
}

$premiereEntree=($pageActuelle-1)*$articleParPage;

if($premiereEntree <= 1)
{
    $premiereEntree = 0;
}

$retour_utilisateurs = mysql_query('SELECT * FROM article WHERE categorie = "pinceaux_accessoires" AND sous_categorie = "levres_pa" AND disponible = 1 ORDER BY article_ID DESC LIMIT '.$premiereEntree.', '.$articleParPage.'') or die (mysql_error());

-------------------------------------------------------------------------------------

Code affichage résultats :



Code :
while($donnees_utilisateurs = mysql_fetch_assoc($retour_utilisateurs)) {
           $utilisateur_id =  $donnees_utilisateurs["utilisateur_ID"];
           $id =  $donnees_utilisateurs["article_ID"];
       echo '<div id="affichage_article_utilisateur">';
       echo '<a href="page_utilisateur.php?id='.$utilisateur_id.'">'.$donnees_utilisateurs["pseudo_createur_article"].'</a>';
       echo '<a href="article.php?id='.$id.'"><img src="' . $donnees_utilisateurs["lien_article"] . '" /></a>';
       echo ''.$donnees_utilisateurs["prix"].' €';
       echo '</div>';
       }

       echo '<div id="pagination">';
       echo '<div class="pagination">';
       echo '<p align="center">';
       echo '<center><ul>';

-----------------------------------------------------------------

Suite code pagination:

Code :
$Ncom = $total_utilisateurs; // Nombre de commentaires au total (modifiable)
$Nmax = 9; // Nombre de commentaires par page (modifiable)
$nbre_cle = 5; // Nombre de clés que l'on veut afficher (modifiable)
$pagin_pas = 5; // Taille du pas du défilement rapide (modifiable)

    if(isset($_GET['page']))
    {
        $pagin_pos = $ID_message_supprime  = intval($_GET['page']);
    }
    else{
        $pagin_pos = 1;
    }
    
    if($pagin_pos == 0 or $pagin_pos == null)
{
    $pagin_pos = 1;
}

$pagin_last = ((int)(($Ncom + $Nmax - 1) / $Nmax ));

if ($pagin_pos > 1) //Si l'on se trouve au début
{
  $debut = '<li><a href="levres_pa.php?page=1">&laquo;&laquo;</a></li> ';
  $page33 = $pagin_pos - 1;
  $pp = '<li><a href="levres_pa.php?page=' . $page33 . '">&laquo;</a></li> ';
}
else
{
  $debut = '<li><a href="levres_pa.php?page=1">&laquo;&laquo;</a></li>';
  $pp = '<li><a href="levres_pa.php?page=1">&laquo</a></li>';
};
if ($pagin_pos > $pagin_pas) //Si l'on se trouve à plus de 5 pages
{
  $pp5 = '<li><a href="levres_pa.php?page=" . ('.$pagin_pos.' - '.$pagin_pas.') . "">Précédent5</a></li> ';
}
else
{
  $pp5 = "Précédent5 ";
};
if ($pagin_pos < $pagin_last) //Si l'on se trouve à la fin
{
  $fin = ' <li><a href="levres_pa.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $pagin_posf = $pagin_pos + 1;
  $ps = '<li><a href="levres_pa.php?page='.$pagin_posf.'">&raquo;</a></li> ';
}
else
{
  $fin = ' <li><a href="levres_pa.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $ps = '<li><a href="levres_pa.php?page='.$pagin_last.'">&raquo;</a></li>';
};
if ($pagin_pos < ($pagin_last - $pagin_pas + 1)) //Si l'on se trouve à moins de 5 pages de la fin
{
  $ps5 = '<a href="levres_pa.php?page=" . ('.$pagin_pos.' + '.$pagin_pas.') . "">suivant5</a> ';
}
else
{
  $ps5 = " suivant5 ";
};

if (($pagin_pos > ((int)($nbre_cle / 2) + 1))) //Si besoin des "..." de droite
{
  $sepg = '<li> <li><a href="levres_pa.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepg = "     ";
}
if (($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))) //Si besoin des "..." de gauche
{
  $sepd = '<li> <li><a href="levres_pa.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepd = "     ";
}

if ($pagin_pos > ((int)($nbre_cle / 2))) // Arret du défilement quand on arrive aux bornes
{
  if ($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))
  {
   $i=($pagin_pos-((int)($nbre_cle / 2)));
  }  
  else
  {
    $i=$pagin_last - $nbre_cle + 1;
  }
}  
else
{
  $i=1;
}
$liste = "";
$j = $i + $nbre_cle;

while ($i < $j)
{
  if (($i <= $pagin_last) and ($i >= 1))
  {
    $cle = ' <li><a href="levres_pa.php?page='.$i.'">'.$i.'</a></li>';
    if ($i == $pagin_pos)
      {
        $liste = $liste . "<li>$cle</li>";
      } else
      {
        $liste = $liste . $cle . " ";
      }
  }
  ++$i;
}


if($total_utilisateurs == 0){
    
}else{
echo ''.$debut.''.$pp.''.$sepg.''.$liste.''.$sepd.''.$ps.''.$fin.'<br/>';
}
echo '</ul></center></p></div>';


--------------------------------------------------------------------------
--------------------------------------------------------------------------


Maintenant code pagination de ma fonction de recherche requête en dynamique (qui fonctionne pas ) :


//Dans le cas ou l'utilisateur a déjà posté une recherche on garde sa requête en session sous $_SESSION['req1']//

Code :
if(isset( $_SESSION['req1']))
{

   $r = $_SESSION['req1'];
   $total_utilisateurs = $_SESSION['tot_ut'];
    
          echo $r."<br/>";
        
$d= mysql_query($r) or die(mysql_error());
    

    echo '<br/><br/><br/>';
          $re = mysql_num_rows($d);
        


//[b]On affiche les résultats[/b]//
        
        
         echo '<div id="contenair_article">';
        
         while($donnees_utilisateurs = mysql_fetch_assoc($d)) {
            
        $id =  $donnees_utilisateurs["article_ID"];
         $utilisateur_id =  $donnees_utilisateurs["utilisateur_ID"];
       echo '<div id="affichage_article_utilisateur">';
       echo '<a href="page_utilisateur.php?id='.$utilisateur_id.'">'.$donnees_utilisateurs["pseudo_createur_article"].'</a>';
       echo '<a href="article.php?id='.$id.'"><img src="' . $donnees_utilisateurs["lien_article"] . '" /></a>';
       echo ''.$donnees_utilisateurs["prix"].' €';
       echo '</div>';

         }

//[b]Code pagination[/b]//        
        
       echo '<div id="pagination">';
       echo '<div class="pagination">';
       echo '<center><ul>';

       $Ncom = $total_utilisateurs; // Nombre de commentaires au total (modifiable)
$Nmax = 9; // Nombre de commentaires par page (modifiable)
$nbre_cle = 5; // Nombre de clés que l'on veut afficher (modifiable)
$pagin_pas = 5; // Taille du pas du défilement rapide (modifiable)

    if(isset($_GET['page']))
    {
        $pagin_pos = $ID_message_supprime  = intval($_GET['page']);
    }
    else{
        $pagin_pos = 1;
    }
    
    if($pagin_pos == 0 or $pagin_pos == null)
{
    $pagin_pos = 1;
}

$pagin_last = ((int)(($Ncom + $Nmax - 1) / $Nmax ));

if ($pagin_pos > 1) //Si l'on se trouve au début
{
  $debut = '<li><a href="recherche.php?page=1">&laquo;&laquo;</a></li> ';
  $page33 = $pagin_pos - 1;
  $pp = '<li><a href="recherche.php?page=' . $page33 . '">&laquo;</a></li> ';
}
else
{
  $debut = '<li><a href="recherche.php?page=1">&laquo;&laquo;</a></li>';
  $pp = '<li><a href="recherche.php?page=1">&laquo</a></li>';
};
if ($pagin_pos > $pagin_pas) //Si l'on se trouve à plus de 5 pages
{
  $pp5 = '<li><a href="recherche.php?page=" . ('.$pagin_pos.' - '.$pagin_pas.') . "">Précédent5</a></li> ';
}
else
{
  $pp5 = "Précédent5 ";
};
if ($pagin_pos < $pagin_last) //Si l'on se trouve à la fin
{
  $fin = ' <li><a href="recherche.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $pagin_posf = $pagin_pos + 1;
  $ps = '<li><a href="recherche.php?page='.$pagin_posf.'">&raquo;</a></li> ';
}
else
{
  $fin = ' <li><a href="recherche.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $ps = '<li><a href="recherche.php?page='.$pagin_last.'">&raquo;</a></li>';
};
if ($pagin_pos < ($pagin_last - $pagin_pas + 1)) //Si l'on se trouve à moins de 5 pages de la fin
{
  $ps5 = '<a href="recherche.php?page=" . ('.$pagin_pos.' + '.$pagin_pas.') . "">suivant5</a> ';
}
else
{
  $ps5 = " suivant5 ";
};

if (($pagin_pos > ((int)($nbre_cle / 2) + 1))) //Si besoin des "..." de droite
{
  $sepg = '<li> <li><a href="recherche.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepg = "     ";
}
if (($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))) //Si besoin des "..." de gauche
{
  $sepd = '<li> <li><a href="recherche.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepd = "     ";
}

if ($pagin_pos > ((int)($nbre_cle / 2))) // Arret du défilement quand on arrive aux bornes
{
  if ($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))
  {
   $i=($pagin_pos-((int)($nbre_cle / 2)));
  }  
  else
  {
    $i=$pagin_last - $nbre_cle + 1;
  }
}  
else
{
  $i=1;
}
$liste = "";
$j = $i + $nbre_cle;

while ($i < $j)
{
  if (($i <= $pagin_last) and ($i >= 1))
  {
    $cle = ' <li><a href="recherche.php?page='.$i.'">'.$i.'</a></li>';
    if ($i == $pagin_pos)
      {
        $liste = $liste . "<li>$cle</li>";
      } else
      {
        $liste = $liste . $cle . " ";
      }
  }
  ++$i;
}


echo ''.$debut.''.$pp.''.$sepg.''.$liste.''.$sepd.''.$ps.''.$fin.'<br/>';
echo '</ul></center></div>';

        
echo '</div>';
echo '</div>';

----------------------------------------------------------------

//Dans le cas ou l’utilisateur envoi sa recherche pour la première fois//


Code :
}
else{
$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche']));

$explode = explode(" ",$recherche);


$a = 0;



$articleParPage=9;

//Requête dynamique//

if($recherche == '')
{
     echo'Zone de recherche vide.';
}
else{
    
    $req = "SELECT COUNT(*) AS total FROM article ";
    
     foreach($explode as $mot1)
        {

         if($a == 0)
         {
                $req .= " WHERE ";
         }
         else
         {
              $req .= " OR ";
         }
        
         $req .= "titre LIKE '%$mot1%'";
         echo $req;
         $a++;
    
        }
    
    
    $dd= mysql_query($req);
    $rep_utilisateurs = mysql_fetch_assoc($dd);
    echo '<br/>';
  echo  $_SESSION['tot_ut'] = $total_utilisateurs = $rep_utilisateurs['total']." Résultats<br/>";
    
//[b]Pagination[/b]//


$nombreDePages=ceil($total_utilisateurs/$articleParPage);

if(isset($_GET['page']))
{
     $pageActuelle=intval($_GET['page']);

     if($pageActuelle>$nombreDePages)
     {
          $pageActuelle=$nombreDePages;
     }
}
else
{
     $pageActuelle=1;    
}

$premiereEntree=($pageActuelle-1)*$articleParPage;

if($premiereEntree <= 1)
{
    $premiereEntree = 0;
}

//[b]Suite requête dynamique[/b]//


     $b = 0;
    
     $r ="SELECT * FROM article ";

foreach($explode as $mot1)
        {

         if($b == 0)
         {
                $r .= " WHERE ";
         }
         else
         {
              $r .= " OR ";
         }
        
         $r .= "titre LIKE '%$mot1%' ";
         $b++;
        
        }
$r .="ORDER BY article_ID DESC LIMIT $premiereEntree, $articleParPage";
        echo $r."<br/>";
        $_SESSION['req1'] = $r;
$d= mysql_query($r) or die(mysql_error());
    

    echo '<br/><br/><br/>';
          $re = mysql_num_rows($d);
        


//[b]Affichage résultats[/b]//
        
        
         echo '<div id="contenair_article">';
        
         while($donnees_utilisateurs = mysql_fetch_assoc($d)) {
            
        $id =  $donnees_utilisateurs["article_ID"];
         $utilisateur_id =  $donnees_utilisateurs["utilisateur_ID"];
       echo '<div id="affichage_article_utilisateur">';
       echo '<a href="page_utilisateur.php?id='.$utilisateur_id.'">'.$donnees_utilisateurs["pseudo_createur_article"].'</a>';
       echo '<a href="article.php?id='.$id.'"><img src="' . $donnees_utilisateurs["lien_article"] . '" /></a>';
       echo ''.$donnees_utilisateurs["prix"].' €';
       echo '</div>';

         }
        
//[b]Suite Pagination[/b]//

      
       echo '<div id="pagination">';
       echo '<div class="pagination">';
       echo '<center><ul>';

       $Ncom = $total_utilisateurs; // Nombre de commentaires au total (modifiable)
$Nmax = 9; // Nombre de commentaires par page (modifiable)
$nbre_cle = 5; // Nombre de clés que l'on veut afficher (modifiable)
$pagin_pas = 5; // Taille du pas du défilement rapide (modifiable)

    if(isset($_GET['page']))
    {
        $pagin_pos = $ID_message_supprime  = intval($_GET['page']);
    }
    else{
        $pagin_pos = 1;
    }
    
    if($pagin_pos == 0 or $pagin_pos == null)
{
    $pagin_pos = 1;
}

$pagin_last = ((int)(($Ncom + $Nmax - 1) / $Nmax ));

if ($pagin_pos > 1) //Si l'on se trouve au début
{
  $debut = '<li><a href="recherche.php?page=1">&laquo;&laquo;</a></li> ';
  $page33 = $pagin_pos - 1;
  $pp = '<li><a href="recherche.php?page=' . $page33 . '">&laquo;</a></li> ';
}
else
{
  $debut = '<li><a href="recherche.php?page=1">&laquo;&laquo;</a></li>';
  $pp = '<li><a href="recherche.php?page=1">&laquo</a></li>';
};
if ($pagin_pos > $pagin_pas) //Si l'on se trouve à plus de 5 pages
{
  $pp5 = '<li><a href="recherche.php?page=" . ('.$pagin_pos.' - '.$pagin_pas.') . "">Précédent5</a></li> ';
}
else
{
  $pp5 = "Précédent5 ";
};
if ($pagin_pos < $pagin_last) //Si l'on se trouve à la fin
{
  $fin = ' <li><a href="recherche.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $pagin_posf = $pagin_pos + 1;
  $ps = '<li><a href="recherche.php?page='.$pagin_posf.'">&raquo;</a></li> ';
}
else
{
  $fin = ' <li><a href="recherche.php?page='.$pagin_last.'">&raquo;&raquo;</a></li>';
  $ps = '<li><a href="recherche.php?page='.$pagin_last.'">&raquo;</a></li>';
};
if ($pagin_pos < ($pagin_last - $pagin_pas + 1)) //Si l'on se trouve à moins de 5 pages de la fin
{
  $ps5 = '<a href="recherche.php?page=" . ('.$pagin_pos.' + '.$pagin_pas.') . "">suivant5</a> ';
}
else
{
  $ps5 = " suivant5 ";
};

if (($pagin_pos > ((int)($nbre_cle / 2) + 1))) //Si besoin des "..." de droite
{
  $sepg = '<li> <li><a href="recherche.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepg = "     ";
}
if (($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))) //Si besoin des "..." de gauche
{
  $sepd = '<li> <li><a href="recherche.php?page='.$pagin_pos.'">...</a></li>';
} else
{
  $sepd = "     ";
}

if ($pagin_pos > ((int)($nbre_cle / 2))) // Arret du défilement quand on arrive aux bornes
{
  if ($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))
  {
   $i=($pagin_pos-((int)($nbre_cle / 2)));
  }  
  else
  {
    $i=$pagin_last - $nbre_cle + 1;
  }
}  
else
{
  $i=1;
}
$liste = "";
$j = $i + $nbre_cle;

while ($i < $j)
{
  if (($i <= $pagin_last) and ($i >= 1))
  {
    $cle = ' <li><a href="recherche.php?page='.$i.'">'.$i.'</a></li>';
    if ($i == $pagin_pos)
      {
        $liste = $liste . "<li>$cle</li>";
      } else
      {
        $liste = $liste . $cle . " ";
      }
  }
  ++$i;
}


echo ''.$debut.''.$pp.''.$sepg.''.$liste.''.$sepd.''.$ps.''.$fin.'<br/>';
echo '</ul></center></div>';



RE: Pagination - Ter Rowan - 23-05-2014

je ne sais pas où est le bug mais tu dupliques ton code,

commence par factoriser

créer une fonction pour afficher
une fonction pour requeter , etc...


tu auras beaucoup moins de lignes de code, on comprendra beaucoup mieux et on trouvera bcp plus vite (et ça se trouve, rien qu'en factorisant, tu corrigeras sans faire exprès)


RE: Pagination - Xenos - 23-05-2014

Je rejoins Ter Rowan.
J'avais hésité à souligner le mot "morceau" dans ma réponse, j'aurai peut-être du ^^
Si tu veux pouvoir comprendre puis maintenir un code, regrouper les lignes identiques (factoriser) sera d'un grand secours, et permettra de bien délimiter ce que chaque morceau de code fait.

• Au survol, je dirai que le problème vient du fait que tu enregistre la requête MySQL dans la session. Bon, déjà, la requête est une chaine de texte (string), donc la stocker au lieu de la regénérer n'apporte pas grand chose si ce n'est de la lourdeur; mais surtout, si tu stockes la requête (avec son "LIMIT $N,$P") alors la même requête sera exécutée sur chaque page (puisque tu exécutes la requête stockée apparemment).

Si tu tiens à stocker la requête, stocke uniquement la requête sans la clause LIMIT, et ajoute cette clause avant d'exécuter la requête (mysqli->query($req.' LIMIT '.$N.','.$P).

Bon, c'est pas mon style habituel (stocker des bouts de requêtes et ajouter la clause "LIMIT" à la volée), mais cela collera au style "scriptural" donné...

Une requête préparée avec une clause LIMIT ?,? permettrait une bien meilleure relecture du code (qu'on utilise PDO ou MySQLi, perso, je préfère MySQLi).


RE: Pagination - hercull - 23-05-2014

Merci pour vos réponses,

Je veux bien factoriser mon code mais je ne sais pas comment m'y prendre, peut être un exemple avec un bout de mon code?

J'enregistre la requête dans la session car j'ai n'est pas trouvé d'autre moyen pour la passer de page en page avec la pagination tout en gardant ma requête, si tu as une autre solution je suis preneur.

Que fait cette clause? (mysqli->query($req.' LIMIT '.$N.','.$P)

Une fois la requête stocker sans le LIMIT je ne comprend pas en quoi cela résous mon probleme, car le LIMIT permet de n'afficher qu'un nombre choisi de résultats par page, merci de m’éclairer.

Cordialement.


RE: Pagination - hercull - 25-05-2014

Bon je n'arrive pas à rajouter cette clause dans mon code : (mysqli->query($req.' LIMIT '.$N.','.$P)J'ai une erreur il me dit ce signe-> pose probleme je ne sais pas pourquoi?

De plus mon système ne fonctionne pas, car une fois ma requête enregistrer en session je ne peu plus taper de nouvelle recherche, celle en session reste toujours.

J'ai vraiment besoin d'aide soit pour m'aider à modifier mon code pour que sa fonctionne soit pour me m'aider à trouver une autre manière de procéder svp.
Cela fait 2 semaines que je suis dessus j'en peut plus.


RE: Pagination - Xenos - 25-05-2014

$mysqli-> est la syntaxe objet, où $mysqli est la variable contenant l'objet de type "MySQLi" qui se charge de faire les queries (entre autres). Cf la documentation mysqli sur php.net

Php râle car "mysqli->query" signifie "prendre la constante 'mysqli', qui n'existe pas d'où le fait qu'il râle, et appliquer la méthode 'query()'".
La syntaxe non-orientée objet (dite procédurale) sera mysqli_query().

Une variable dans la session ($_SESSION) restera tant que la session ne sera pas détruite (déconnexion explicite de l'utilisateur, via une commande session_* que j'ai oubliée), ou tant qu'elle ne sera pas explicitement détruite dans le code (via unset($_SESSION[...])) ou réaffectée ($_SESSION[...] = null par exemple).

Donc, il te faut savoir à quel moment, dans le programme/code/script, cette variable devrait être remise à zéro.