Présentation d'un catalogue par rubrique et pagination automatique des résultats
bocherrot
Messages postés3Date d'inscriptionjeudi 30 octobre 2008StatutMembreDernière intervention 2 mars 2009
-
1 mars 2009 à 20:19
bocherrot
Messages postés3Date d'inscriptionjeudi 30 octobre 2008StatutMembreDernière intervention 2 mars 2009
-
2 mars 2009 à 22:44
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,
//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?
A voir également:
Présentation d'un catalogue par rubrique et pagination automatique des résultats
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 2 mars 2009 à 06:18
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
bocherrot
Messages postés3Date d'inscriptionjeudi 30 octobre 2008StatutMembreDernière intervention 2 mars 2009 2 mars 2009 à 16:14
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
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 2 mars 2009 à 18:07
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 :