Présentation d'un catalogue par rubrique et pagination automatique des résultats

Signaler
Messages postés
3
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
2 mars 2009
-
Messages postés
3
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
2 mars 2009
-
bocherrot
Je cherche déjà depuis plusieurs semaines le moyen de présenter un catalogue qui possède plusieurs rubriques.
A force de m'arracher les cheveux à chercher une solution, je deviens chauve!
Le problème :
Le visiteur fait le choix d'une rubrique à partir d'un menu déroulant, les résultats de ce choix doit s'afficher dans la page, présenté en vignettes comportant image, nom, description et url. Si la page comporte plus de 10 vignettes, les autres vignettes s'affiches à la place des par un système de pagination (précédent - suivant).
Le menu déroulant alimenté par une table mysql se trouve sur la même page que la présentation des vignettes.
J'utilise php5 et mysql 5.
J'ai trouvé un code sur ce site qui fonctionne parfaitement en faisant une requête SELECT * WHERE rubrique = 'nom rubrique'.
mais lorsque je remplace 'nom rubrique' par la variable $rubrique du menu déroulant,  SELECT * WHERE rubrique = '$rubrique', La page s'affiche correctement. Le problème vient lorsque je clique sur les pages suivantes page 2 ou 3...c'est une page d'une autre rubrique qui s'affiche.
Voici le code :
La base de données:
CREATE TABLE `mesmaquettes` (<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

`id` int(10) unsigned NOT NULL auto_increment,

`rubrique` varchar(255) collate latin1_general_ci NOT NULL,

` idrubrique` int(10) unsigned NOT NULL,

`image` varchar(255) collate latin1_general_ci NOT NULL,

`url` varchar(255) collate latin1_general_ci NOT NULL,

`descriptif` varchar(255) collate latin1_general_ci NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

 

La page maquettes.php

<html><head></head>

<center>

----

     

              <center>

              <?php

require 'fonctions.inc.php';

// Connexion à la base de données

Require (connection à ma base.php");

?>

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">

<select name='rubrique'>

<option value="0">Choisissez votre rubrique</option>

<?php

$sql = mysql_query("SELECT DISTINCT rubrique FROM mesmaquettes ORDER BY rubrique ASC");

 

while ( $row = mysql_fetch_array($sql)) {

 

 { extract($row);

//echo "<option value='Selectionnez une Rubrique '>";

$selected = '';
if($rubrique  $row["rubrique "]) { $selected "selected"; }

echo '<option value="'.$row[' rubrique '].'" $selected>'.$row[' rubrique '].'</option>';

 

}

}

echo "</select>";

echo "

"value=\"Choisir\"></form>\n";

 

?>

<?php

//

if (!empty($_POST["rubrique "]))

$ rubrique = ($_POST[' rubrique ']);

elseif (!empty($_GET["rubrique "]))

$ rubrique = $_GET["rubrique "];

// Paramétrage de la requête (ne pas modifier le nom des variable)

$table = "mesmaquettes"; // Table à sélectionner dans la base

$champ1 = "image"; // Champ de la table à afficher pour tester ce script

$champ2 = " rubrique ";

$champ3 = "nom";

$champ4 = "url";

$sql = "SELECT * FROM $table WHERE  $champ2 like '%$ rubrique %'"; // Requête initiale (à compléter si nécessaire)

$parpage = 16; // Nombre d'enregistrements par page à afficher

//==============================================================================

// Déclaration et initialisation des variables (ici ne rien modifier)

//==============================================================================

// On définit le suffixe du lien url qui affichera les pages

// $_SERVEUR['PHP_SELF'] donne l'arborescence de la page courante
$url $_SERVER['REQUEST_URI']."?$champ2\" rubrique \"?limit=";

$total = mysql_query($sql); // Résultat total de la requête $sql

$nblignes = mysql_num_rows($total); // Nbre total d'enregistrements

// On calcule le nombre de pages à afficher en arrondissant

// le résultat au nombre supérieur grâce à la fonction ceil()

$nbpages = ceil($nblignes/$parpage);

//==============================================================================

// Exemple d'affichage HTML

//==============================================================================

//echo "
\n"."On affiche ".$parpage." enregistrements par page, ";

echo "soit un total de ".$nbpages." pages.

\n";

// Si une valeur 'limit' est passée par url, on vérifie la validité de

// cette valeur par mesure de sécurité avec la fonction validlimit()

// cette fonction retourne automatiquement le résultat de la requête

$result = validlimit($nblignes,$parpage,$sql);

// On affiche le résultat de la requête

// On crée donc ici son propre tableau pour lequel on souhaite une pagination

while ($ligne = mysql_fetch_array($result)) {

echo "
";

echo "[.$url.$limit. ".($i + 1)."] | " ;
    }
  }
  // Si l'on a qu'une page on affiche rien
  else {
    $html .= "";
  }
  $html .= suivant($url,$parpage,$nblignes); // On crée le lien suivant
  // On retourne le code html
  return $html;
}
function validlimit($nblignes,$parpage,$sql)
{
  // On vérifie l'existence de la variable $_GET['limit']
  // $limit correspond à la clause LIMIT que l'on ajoute à la requête $sql
  if (isset($_GET['limit'])) {
    $pointer = split('[,]', $_GET['limit']); // On scinde $_GET['limit'] en 2
    $debut = $pointer[0];
    $fin = $pointer[1];
    // On vérifie la conformité de la variable $_GET['limit']    if (($debut >0) && ($debut < $nblignes) && ($fin $parpage)) {
      // Si $_GET['limit'] est valide on lance la requête pour afficher la page
      $limit = $_GET['limit']; // On récupère la valeur 'limit' passée par url
      $sql .= " LIMIT ".$limit.";"; // On ajoute $limit à la requête $sql
      $result = mysql_query($sql); // Nouveau résultat de la requête
    }
    // Sinon on affiche la première page
    else {
      $sql .= " LIMIT 0,".$parpage.";"; // On ajoute la valeur LIMIT à la requête
      $result = mysql_query($sql); // Nouveau résultat de la requête
    }
  }
  // Si la valeur 'limit' n'est pas connue, on affiche la première page
  else {
    $sql .= " LIMIT 0,".$parpage.";"; // On ajoute la valeur LIMIT à la requête
    $result = mysql_query($sql); // Nouveau résultat de la requête
  }
  // On retourne le résultat de la requête
  return $result;
}
function precedent($url,$parpage,$nblignes)
{
  // On vérifie qu'il y a au moins 2 pages à afficher
  if ($nblignes > $parpage) {
    // On vérifie l'existence de la variable $_GET['limit']
    if (isset($_GET['limit'])) {
      // On scinde la variable 'limit' en utilisant la virgule comme séparateur
      $pointer = split('[,]', $_GET['limit']);
      // On récupère le nombre avant la virgule et on soustrait la valeur $parpage
      $pointer = $pointer[0]-$parpage;
      // Si on atteint la première page, pas besoin de lien 'Précédent'
      if ($pointer < 0) {
        $precedent = "";
      }
      // Sinon on affiche le lien avec l'url de la page précédente
      else {
        $limit = "$pointer,$parpage";
        $precedent = "[.$url.$limit. ] | ";
      }
    }
    else {
      $precedent = ""; // On est à la première page, pas besoin de lien 'Précédent'
    }
  }
  else {
  $precedent = ""; // On a qu'une page, pas besoin de lien 'Précédent'
  }
  return $precedent;
}
function suivant($url,$parpage,$nblignes)
{
  // On vérifie qu'il y a au moins 2 pages à afficher
  if ($nblignes > $parpage) {
    // On vérifie l'existence de la variable $_GET['limit']
    if (isset($_GET['limit'])) {
      // On scinde la variable 'limit' en utilisant la virgule comme séparateur
      $pointer = split('[,]', $_GET['limit']);
      // On récupère le nombre avant la virgule auquel on ajoute la valeur $parpage
      $pointer = $pointer[0] + $parpage;
      // Si on atteint la dernière page, pas besoin de lien 'Suivant'
      if ($pointer >= $nblignes) {
        $suivant = "";
      }
      // Sinon on affiche le lien avec l'url de la page suivante
      else {
        $limit = "$pointer,$parpage";
        $suivant = "[.$url.$limit. ]";
      }
    }
    // Si pas de valeur 'limit' on affiche le lien de la deuxième page
    if (@$_GET['limit']== false) {
      $suivant = "[.$url.$parpage. ]";
    }
  }
  else {
  $suivant = ""; // On a qu'une page, pas besoin de lien 'Suivant'
  }
  return $suivant;
}
// Fin du script

?>

Comment faire pour que ce soit uniquement les éléments de la rubrique sélectionnée par le menu qui soient paginés?
Une âme charitable peut elle me donner un modèle qui fonctionne à partir d'un menu déroulant?

5 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Je n'ai regardé que la syntaxe hors fonctions.
Voilà déjà quelques erreurs :

<form action= "<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
=>
<form action="<?php $_SERVER('PHP_SELF'); ?>" method="post">
$selected "selected"; > la bonne syntaxe serait : $selected = 'selected="selected"';
if($rubrique $row["rubrique "]) >
la variable $rubrique n'est définie qu'après, elle n'a pas d'existence sur cette ligne. De plus il y a un espace à plusieurs endroit sur
$ rubrique

Tu ne gères pas les erreurs possibles des requêtes sql
$url $_SERVER['REQUEST_URI']."?$champ2" rubrique "?limit=";
=>
Ce n'est pas plutôt ça :$url $_SERVER['REQUEST_URI'].'?'.$champ2"rubrique"&limit=';
... parce que les espaces c'est pas top et le second '?' non plus

Il y a sans doute d'autres erreurs, mais corrige celles ci dans un premier temps et garde un peu de cheveux pour la suite

Cordialement,

Kohntark -
Messages postés
3
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
2 mars 2009

Salut kohntark
J'ai suivi tes conseils mais voici le résultat :

1- Le <form action="<?php $_SERVER('PHP_SELF'); ?>" method="post"> me renvoie une page blanche. J'ai donc conservé mon  
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post"> .De plus
echo htmlentities sert pour la sécurité dans les formulaires.

2- J'ai changé mon code "selected" par le tien. Le code fonctionne mais ne change pas mon problème.

3- J'ai changer mon code $url $_SERVER['REQUEST_URI']."?$champ2" rubrique "?limit=";
par le tien, qui me renvoit une page vide. J'ai donc bidouillé un peu en faisant cà: $url $_SERVER['PHP_SELF'].'?'.$champ2'$rubrique'.'&limit=';
Ma page prend bien en compte les catégories et le nombres de pages dans la catégorie mais quand je clique sur page2 ou 3 par exemple, c'est une autre catégorie qui s'affiche.

Je pense qu'il n'y a qu'un détail qui cloche mais le gros problème est de le localiser.
Cordialement,
bocherrot
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

1- Le <form action= "<?php $_SERVER('PHP_SELF'); ?>" method="post"> me renvoie une page blanche.

Ah bon ?? A part une mauvaise config je ne vois pas trop ce qui peut être à l'origine.
Quel est le chemin http complet du fichier maquettes.php ?
Qu'as tu dans la barre d'adresse après le click de soumission ?

De plus
echo htmlentities sert pour la sécurité dans les formulaires.

Non, htmlentities ne sert à rien du tout à cet endroit et ne devrait pas s'y trouver. C'est le chemin d'un fichier, tu peux y mettre ce que tu veux tu n'auras jamais de problème de sécurité avec ça.
Ce qui sert à la sécurité c'est l'appliquer sur les données post (ou GET) renvoyées par l'utilisateur (chose que tu as d'ailleurs oublié de faire) Voir aussi strip-tags.

J'ai changer mon code $url $_SERVER['REQUEST_URI']."?$champ2" rubrique "?limit=";
par le tien, qui me renvoit une page vide. J'ai donc bidouillé un peu en faisant cà:
$url $_SERVER['PHP_SELF'].'?'.$champ2'$rubrique'.'&limit=';

=>
tu as corrigé une autre erreur (comme dis je n'ai regardé "que" la syntaxe)
Concernant le 'PHP_SELF' (comme celui du form), il ne sert probablement ... à rien. Autant mettre une adresse relative, c'est plus simple et ça ne prend pas de ressources (dérisoires dans ton cas mais bon) Bien sur il faudrait également viré le $url des fonctions.

Bon, cela étant dit, pour débogguer :
- affiche les erreurs php (c'est peut être déjà le cas, mais vu tes dires j'ai un gros doute)
- affiche toutes les variables qui te sont utiles : les post, les get, les variables propres aux fonctions ...
- affiche tes requêtes sql, et TRAITE LES ERREURS !! (if(!$ta requete) die(mysql_error());)
- surveille la var $rubrique
- traite tes variables post pour savoir si elles sont correctement définies (isset)
- ...

Tu peux par exemple ajouter ça en tout début de script :

ini_set ('display_errors', 'on');
error_reporting(E_ALL);
print_r($_POST);
print_r($_GET);
etc ...

et mettre des echo dans les fonctions, les requêtes, ...
Jette également un oeil au code html généré.

A partir de là tu devrais pouvoir débogguer en, disons, 10 minutes, .... et sans arrachage de cheveux :)

Bon courage,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Tu as bien tenu compte de ma remarque "la variable $rubrique n'est définie qu'après" au fait ?

Kohntark -
Messages postés
3
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
2 mars 2009

J’ai fini de m’arracher les cheveux !


Hier, j’ai trouvé un script php de pagination sur un blog en anglais. J’ai réussi à l’adapter pour mon site, les essais sont concluants!


Je propose donc ma version modifiée sur ce forum, elle peut servir comme modèle à qui veut :


-Tout le code sur une seule page, aucune fonctions requises-



< !--****** le formulaire*****--><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>






 <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"method="post">





<select name='rubrique'> 




<option value="0">Choisissez votre rubrique</option>



<?




// Connexion a la base de donnée


///Require(“connection à la base mysql ");



$sql = mysql_query("SELECT DISTINCT rubrique FROM matable ORDER BY rubrique ASC");





while ( $row = mysql_fetch_array($sql)) {





{ extract($row);





//echo "<option value='Selectionnez une Rubrique'>";





$selected = 'selected="selected"';





if($rubrique = $row["rubrique"]);





echo '<option value="'.$row['rubrique'].'"$selected>'.$row['rubrique'].'</option>';





}





}





echo "</select>";





echo "</form>\n";




?>


< !--***** le résultat de la requête*****-->



<?php





if (!empty($_POST["rubrique"]))





$rubrique = ($_POST['rubrique']);





elseif (!empty($_GET["rubrique"]))





$rubrique = $_GET["rubrique"];





echo $rubrique;





if($rubrique)





{





if(!isset($_GET['page'])){





$page = 1;





} else {





$page = $_GET['page'];





}






 







// Define the number of results per page





$max_results = 25;





// Figure out the limit for the query based





// on the current page number.





$from = (($page * $max_results) - $max_results);





$query "SELECT image, rubrique, nom, url FROM matable WHERE rubrique'$rubrique ' ORDER BY rubrique ASC LIMIT $from, $max_results ";





$result = mysql_query($query);





// Recuperation des resultats





while($row = mysql_fetch_row($result)){





$image = $row[0];





$rubrique = $row[1];





$nom = $row[2];





$url = $row[3];





echo "
";





echo "




&nbsp;&nbsp;$nom&nbsp;&nbsp;$rubrique
";


echo "

";


}


?>



 




<!--*****La pagination*****-->



<?php





echo "
";





// Figure out the total number of results in DB:





$total_results mysql_result(mysql_query("SELECT COUNT(*) as Num FROM matable WHERE rubrique'$rubrique'"),0);





// Figure out the total number of pages. Always round up using ceil()





$total_pages = ceil($total_results / $max_results);





echo "<center>Résultat total&nbsp;&nbsp;$total_results
";





// Build Previous Link





if($page > 1){





$prev = ($page - 1);





echo "PRECEDENT&nbsp;";





}





for($i = 1; $i <= $total_pages; $i++){





if(($page) == $i){





echo "[$i]&nbsp;";





} else {





echo "$i&nbsp;";





}





}





// Build Next Link





if($page < $total_pages){




$next = ($page + 1);


echo "SUIVANT";


}


echo "</center>";


}


echo "
";


?>





Merci à toi Kohntark pour ton aide!

à+