barre de navigation page par page: une info non transmise?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : barre de navigation page par page: une info non transmise?

par Boro64 » 04 mai 2009, 14:55

Bingo Ryle
Je l'ai modifié en conséquence, et c'est nikel (enfin presque...le dernier article des listes appelées se transforme en lien...lui aussi! |*() Argh...mais ça, ce sera peut être un autre post...)
Merci encore pour le coup de pouce!
...Heu, et pour mon éventuelle rétrogradation au stade d'embryon???? :lol:
Merci encore à toutes et tous!

par Ryle » 04 mai 2009, 14:19

Ben voilà, t'as mis le doigt dessus :)

Tu arrives sur ta page en spécifiant " $nom = $_POST['mark'] ". Ton traitement se fait correctement, mais lorsque l'utilisateur demande à afficher la page suivante, tu ne transmets plus rien dans $_POST et te contente d'ouvrir l'url... du coup, pas de variable mark, pas de résultat cohérent :)

Il faut donc que tu trouves un moyen pour que lorsque tu ouvres la page suivante, celle-ci puisse disposer de l'information. Tu peux soit stocker ton 'mark' en session (ce qui te permet de le garder sur chacune des pages), soit le transmettre via l'url en plus du paramètre debut (attention, il passera en $_GET au lieu de $_POST)

par Boro64 » 04 mai 2009, 12:13

Bonjour Ryle
La $nom est le résultat du moteur que voilà:
	<form method="post" action="choix-mark.php">
	   <br />
Sélectionner une marque: 
<br />
<select name="mark" class="select-option-menu">
   <br />
<?php

   $requete = mysql_query("SELECT * FROM mark ORDER BY nom ASC ");

   while ($row = mysql_fetch_array($requete)) {
  echo "<option value=\"\"></option>";
    echo "<option value=\"".$row['nom']."\">" .$row['nom']. "</option>";
                                              }
 ?>  
                              
    </select>
       <br />
         <input type="submit" value="Recherche par marque" class="small-input-menu" />
        <br />
        </form>
        	<form method="post" action="choix-fam.php">
 ou une famille de pièces: 
 <br />
 <select name="famille" class="select-option-menu">
       <br />
<?php
$sql = mysql_query ("SELECT * FROM familles ORDER BY nom_fam ASC");
  while ($row = mysql_fetch_array($sql))
  {
  echo "<option value=\"\"></option>";
  echo "<option value=\"".$row['nom_fam']."\">" .$row['nom_fam']. "</option>";
  }
?>
  </select>
     <br />
  <input type="submit" value="Recherche par piece" class="small-input-menu" />
  </form>
d'où $nom = $_POST ['mark'] (dans cet exemple) que je récupère (bien) en arrivant sur la page 'choix-mark.php'.
J'ai bien le sentiment que c'est elle qui se "perd" dans le passage d'une page à l'autre...
Voici d'ailleurs ce qui apparait dans la barre d'adresse:
il s'agit ici du résultat lorsque je clique sur le lien vers la page 2, ce qui correspond bien (ou presque!) au résultat attendu....sauf que la page présentée n'affiche rien...même le nom de la famille affichée a disparu...
Note: Oupssssssss, bien vu pour le count, je modifie!

Edit: :oops: Honte...j'ai honte! Merci à Ryle de m'avoir mis sur la piste!
L'erreur:
Le formulaire du moteur était en _POST et je cherchai la $_GET.....(oui, je sais.....Hououououou :mrgreen: )
ce qui donne donc au final:
	$nom = $_GET['mark'];

// comptage du nombre de lignes de la base
$sql = "SELECT count(id_article) FROM stock WHERE marque ='$nom' AND statut = 0";

//éxécution de la requête
$resultat = mysql_query($sql) or die ('Erreur SQL! <br />'.$sql.'<br />'.mysql_error());

//récupération du nombre total à afficher
$nb_total = mysql_fetch_array($resultat);

//test pour vérifier si ce nombre vaut 0
if (($nb_total = $nb_total[0]) == 0) {
  echo "Aucun article dans la marque <b>$nom</b>, désolé! Merci de revenir plus tard ou de nous interroger.";
}
  else {
echo "Liste des articles de marque <b>$nom</b> en vente";

// sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0  
if (!isset($_GET['debut'])) $_GET['debut'] = 0;
  $nb_affichage_par_page = 4;
  
//Préparation de la requête avec le LIMIT
$sql = "SELECT * FROM stock  WHERE marque = '$nom' AND statut = 0 ORDER BY id_article ASC LIMIT " .$_GET['debut'].','.$nb_affichage_par_page;
//éxécution de la requête
$req = mysql_query($sql)or die ('Erreur SQL! <br />'.$sql.'<br />'.mysql_error());

echo '<br />';
      // on affiche enfin notre barre 
 print $barre;
    echo '<center><span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span></center>';


echo '<hr />';


while ($pieces = mysql_fetch_array($req))
  {
et le form:

Code : Tout sélectionner

<form method="get" action="testbarre.php"> <br /> Sélectionner une marque: <br /> <select name="mark" class="select-option-menu"> <br /> <?php $requete = mysql_query("SELECT * FROM mark ORDER BY nom ASC "); while ($row = mysql_fetch_array($requete)) { echo "<option value=\"\"></option>"; echo "<option value=\"".$row['nom']."\">" .$row['nom']. "</option>"; } ?> </select> <br /> <input type="submit" value="Recherche par marque" class="small-input-menu" /> <br /> </form> <form method="get" action="choix-fam.php"> ou une famille de pièces: <br /> <select name="famille" class="select-option-menu"> <br /> <?php $sql = mysql_query ("SELECT * FROM familles ORDER BY nom_fam ASC"); while ($row = mysql_fetch_array($sql)) { echo "<option value=\"\"></option>"; echo "<option value=\"".$row['nom_fam']."\">" .$row['nom_fam']. "</option>"; } ?> </select> <br /> <input type="submit" value="Recherche par piece" class="small-input-menu" /> </form>
...et là, tout de suite, ça va beaucoup mieux.... :-*
Je mets donc [Résolu], et j'en profite pour demander au staff de PhpFrance, si une telle erreur ne mérite pas que je sois rétrogradé au statut d'embryon ??? :langue:

par Ryle » 04 mai 2009, 11:56

A priori, je dirais que tu dois oublier de repasser les paramètres nécessaires à ta requête lorsque tu génère le lien qui permet de passer à la page suivante. Du genre ta variable $nom, comment la récupères-tu sur la première page et sur les suivantes ?
Est-ce que lorsque l'utilisateur clique sur la page suivante, tu renvoi bien cette info afin que la requête puisse s'exécuter et retourner les enregistrements suivants ?

A noter par ailleurs que pour le count(), tu fais un "statut != 1" tandis que la requête elle même contient un "statut = '0'" (nota, pour un nombre, il faut éviter les apostrophes) ... ça fonctionne probablement, mais ce n'est pas super cohérent (et le jour où tu as pour valeur null, ça marche plus ;))

barre de navigation page par page: une info non transmise?

par Boro64 » 04 mai 2009, 11:32

Bonjour
Voilà mon problème:
A partir d'une requête issue d'un moteur de recherche, j'affiche les résultats sur plusieurs pages (au besoin); la requête se fait bien, ma barre de navigation affiche bien un nombre de pages à suivre en conformité avec les résultats....MAIS, lorsque l'on clique sur page suivante, ou un n° de page quelconque....l'affichage ne se fait pas... :shock:
J'ai le sentiment qu'une l'information issue de ma requête ne suit pas...et là, je ne vois ni laquelle, ni où je la perd...
Voici la partie du code concerné:
// comptage du nombre de lignes de la base
$sql = "SELECT count(id_article) FROM stock WHERE marque ='$nom' AND statut != 1";

//éxécution de la requête
$resultat = mysql_query($sql) or die ('Erreur SQL! <br />'.$sql.'<br />'.mysql_error());

//récupération du nombre total à afficher
$nb_total = mysql_fetch_array($resultat);

//test pour vérifier si ce nombre vaut 0
if (($nb_total = $nb_total[0]) == 0) {
  echo "Aucun article dans la marque <b>$nom</b>, désolé! Merci de revenir plus tard ou de nous interroger.";
}
  else {
echo "Liste des articles de marque <b>$nom</b> en vente";

// si variable $debut n'a pas déjà été déclarée, on l'initialise à 0  
if (!isset($_GET['debut'])) $_GET['debut'] = 0;
  $nb_affichage_par_page = 4;
  
//Préparation de la requête avec le LIMIT
$sql = "SELECT * FROM stock  WHERE marque = '$nom' AND statut = '0' ORDER BY id_article DESC LIMIT " .$_GET['debut'].','.$nb_affichage_par_page;
//éxécution de la requête
$req = mysql_query($sql)or die ('Erreur SQL! <br />'.$sql.'<br />'.mysql_error());
print $req;
echo '<br />';
      // on affiche la barre 
 
    echo '<center><span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span></center>';


echo '<hr />';


while ($pieces = mysql_fetch_array($req))
  {
  
Voilà, je ne mets pas la fonction, celle ci fonctionnant apparemment bien; le problème vient uniquement d'une info "perdue" lors du passage vers les pages suivantes....
Je suis certain que mon problème n'en est pas un, que c'est moi qui ai oublié quelque chose, mais j'avoue ne plus rien voir....
D'avance merci pour vos avis, pistes, etc.