Pagination partiellement fonctionnelle.

Eléphanteau du PHP | 47 Messages

05 févr. 2010, 22:24

Bonjour,

J'ai implémenté dans mon code un script de pagination :
<?php
 
// Connexion à la base de donnée
require_once("connexionMysql.inc.php");
 
 
$ID_AUTEUR = (iSset($_GET['ID_AUTEUR']) ? $_GET['ID_AUTEUR'] : null);
$GENRE = (iSset($_GET['GENRE']) ? $_GET['GENRE'] : null);
 
 ...

// PAGINATION
 
/* 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;
 
// PAGINATION
 
 
$requete  = "SELECT * FROM liste ";
 
 
if ( $ID_AUTEUR != null) {   // permet de filtrer ma liste de livres par auteur
  $requete  .= " WHERE ID_AUTEUR='".$ID_AUTEUR."'";
 
  if ( $GENRE != null) { $requete  .= " and GENRE='".$GENRE."'"; }//filtre par auteur et genre
 
}
else
{
  if( $GENRE != null) { // filtre par genre
  $requete  .= " WHERE GENRE='".$GENRE."'";
  }
}
 
$requete .= " ORDER BY ".$order_by."  ".$order_dir." LIMIT $limit_start, $pagination"; 

$resultat = mysql_query($requete) or die('Erreur SQL !'.$requete.'<br>'.mysql_error());
 
?>
...contenu de ma page...

Puis suite et fin du script de pagination :
<div class="barrenavigation">
 
<?php   

$requete2  = "SELECT COUNT(*) AS nb_total FROM liste ";
 
if ( $ID_AUTEUR != null) {   
  $requete2  .= " WHERE ID_AUTEUR='".$ID_AUTEUR."'";
 
  if ( $GENRE != null) { $requete2  .= " and GENRE='".$GENRE."'"; }
 
}
else
{
  if( $GENRE != null) { // filtre par genre
  $requete2  .= " WHERE GENRE='".$GENRE."'";
  }
}
 
$resultat = mysql_query($requete2) or die('Erreur SQL !'.$requete2.'<br>'.mysql_error());

$nb_total = mysql_fetch_array($resultat);
$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>';
 
?>
</div>
Mon système de pagination fonctionne lorsqu'il s'agit de faire défiler chaque page de la liste complète de mes livres (du style [1 2 3 4 5]). Si je filtre ma liste de livres par genre, cela m'affiche bien mes livres de tel genre et le système de pagination s'adapte au nombre d'enregistrements retournés:du style "[1 2]".Mais si je clique sur la page 2 pour avoir la suite de mes livres de tel genre, c'est la page 2 de la liste complète de livres qui s'affiche... Je n'ai pas pu tester suite à un filtre par auteur, mais le problème doit être le même

Pourriez-vous apporter la solution à ce dysfonctionnement ? Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 févr. 2010, 23:19

Pour ouvrir ta page, tu passes dans l'url l'id de l'auteur, le genre, etc.

Le problème, c'est que dans ton lien de changement de page, il n'y a que le numéro de la page et plus du tout l'information de l'auteur ou du genre :)

Tu peux soit ajouter ces infos dans tes liens, soit stocker ces informations dans la session et venir les y retrouver par la suite sans avoir à les spécifier à chaque fois ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 47 Messages

06 févr. 2010, 12:08

Merci pour ta réponse. J'ai donc modifié mon lien de changement de page :
echo " <a href=\"?GENRE=".$GENRE."&ID_AUTEUR=".$ID_AUTEUR."&page=$i\">$i</a> ";//ajout $GENRE ET AUTEUR pour adapter pagination RYLE.
Cela règle le dysfonctionnement évoqué dans mon précédent message. Mais en testant la pagination avec mon système de tri, je constate une anomalie après avoir cliqué sur un lien de filtrage auteur ou genre dont le résultat est réparti sur plusieurs pages "[1 2 3]". Si je trie par titre ou genre ma liste filtrée de livres en étant positionné sur la page 1, mon tri fonctionne correctement. En revanche si je veux trier de la même façon mais en étant positionné sur une des pages suivantes, le tri s'effectue au vu des résultats de la page 1 et non au vu de la page considérée. Je suppose qu'il faut que le tri prenne en compte la variable $page dans le lien suivant :
$requete .= " ORDER BY ".$order_by."  ".$order_dir." LIMIT $limit_start, $pagination"; 
Rappel de mon code de tri :
// Tri sur colonne
$tri_autorises = array('AUTEUR','TITRE','GENRE');

if(!isset($_GET['order'])) $_GET['order']="";
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'AUTEUR';

// Sens du tri
$order_dir = isset($_GET['inverse']) ? 'DESC' : 'ASC';

// fonction qui affiche les liens
function sort_link($text,$order=false)
{
	global $order_by, $order_dir;
 
	if(!$order)
		$order = $text;
	

	$link = '<a href="?order=' . $order ;
	
	
	
	if (isset($_GET['ID_AUTEUR'])) {            
     $link .= "&ID_AUTEUR=".$_GET['ID_AUTEUR'];	 	
	}
	
	if (isset($_GET['GENRE'])) {            
     $link .= "&GENRE=".$_GET['GENRE'];	 
	}
	
	if($order_by==$order && $order_dir=='ASC')
		$link .= '&inverse=true';
	$link .= '"';
	if($order_by==$order && $order_dir=='ASC')
		$link .= ' class="order_asc"';
	elseif($order_by==$order && $order_dir=='DESC')
	$link .= ' class="order_desc"';
	
	$link .= '>' . $text . '</a>';
 
	return $link;
}
Mais malgré plusieurs essais, je n'arrive pas à ajouter la variable $page dans le tri sans avoir une erreur. Peux-tu m'aider ? Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 févr. 2010, 14:48

Cela fonctionne de la même façon que pour ton id auteur ou ton genre... en fait c'est le même principe pour tout ce que tu veux faire passer dans tes liens et ton url :)
if (isset($_GET['page'])) {            
     $link .= "&page=".$_GET['page'];  
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 47 Messages

06 févr. 2010, 16:03

D'accord merci. Mon code est donc le suivant :
// Fonction qui affiche les liens
function sort_link($text,$order=false)
{
	global $order_by, $order_dir;
 
	if(!$order)
		$order = $text;
	

	$link = '<a href="?order=' . $order ;
	
	
	
	if (isset($_GET['ID_AUTEUR'])) {            
     $link .= "&ID_AUTEUR=".$_GET['ID_AUTEUR'];	 	
	}
	
	
	if (isset($_GET['GENRE'])) {            
     $link .= "&GENRE=".$_GET['GENRE'];	 
	}
	
	if (isset($_GET['page'])) {            // ajout code RYLE
     $link .= "&page=".$_GET['page'];  
}
	
	if($order_by==$order && $order_dir=='ASC')
		$link .= '&inverse=true';
	
	
	$link .= '"';
	
	if($order_by==$order && $order_dir=='ASC')
		$link .= ' class="order_asc"';
	elseif($order_by==$order && $order_dir=='DESC')
	
	
	$link .= ' class="order_desc"';
	
	$link .= '>' . $text . '</a>';
 
	return $link;
}
Lorsque je suis sur la page 2 d'un résultat filtré par genre :

Exemple page 2 :

AUTEUR---TITRE---GENRE

S.Zing-----TITRE1---thriller
C.Yonse---TITRE2---thriller
B.Widule---TITRE3----thriller

Le lien du tri par auteur est du style :
...tri_alternatif_personum.php?order=AUTEUR&ID_AUTEUR=&GENRE=thriller&page=2
Lorsque je clique sur le lien tri ASC par auteur, je m'attendrais à ce que la page 2 affiche:
Widule----TITRE3----thriller
Yonse---TITRE2---thriller
Zing-----TITRE1---thriller

Mais en fait le tri ascendant se fait à partir des mes auteurs dont le nom est au début de l'alphabet. La page 2 affiche donc le même nombre de résultats avec le genre thriller mais cela ne convient pas :
Abul----TITRE4----thriller
Baul----TITRE5----thriller
Coul----TITRE6----thriller

J'avoue que je commence à m'embrouiller...puis-je encore solliciter votre aide ? Merci.