Souci d'url - incrémentation

Souci d'url - incrémentation - PHP - Programmation

Marsh Posté le 04-08-2017 à 09:51:26    

 Bonjour,
 
J'ai un problème assez étrange.
Techniquement mon programme est changé affiché des questions en fonction d'un id et on passe à la question suivante quand on clique sur l'un des choix.
 
Là où c'est étrange c'est que tout fonctionne sauf au niveau de l'url.
 
A la première question on a un id à 0 et quand on clique sur la question suivante on a la bonne question mais dans l'url l'id est toujours à 0. C'est seulement si on répond de nouveau à la question que l'id incrémente correctement.
 
Cela pourrait venir d'ou?  
 
 

Code :
  1. <div class="type-question">
  2.                 <p class="question">
  3.                   <?php
  4.      //echo $_SESSION['questions'];
  5.         if (!empty($_GET['id'])) {
  6.           displayQuestions($_GET['id']);
  7.          } else {
  8.            displayQuestions();
  9.          }
  10.         /* if (intval($_GET['indexQuestion'])< sizeof($_SESSION["question"])-1) {
  11.                $_SESSION["question"][intval($_GET['indexQuestion'])+1];
  12.            }*/
  13.          ?>
  14.                 </p>
  15.               </div>


 
   

Code :
  1. if (!empty($_POST['choix'])) {
  2.         $_GET['id']++;
  3.         //quelque soit le choix, l'appel est toujours le même
  4.         addReponse($_SESSION['id_utilisateur'],$_POST['sondage_en_cours'],
  5.                         $_POST['question'],$_POST['choix']);
  6.         echo $_GET['id'];
  7.          header('Location :index.php?id='.$_GET['id']);
  8.     } else {
  9.         header('Location :index.php?id=0');
  10.     }


 

Code :
  1. function displayAddReponses($idQuestion = 0) {
  2. $query = 'SELECT * FROM sondage_questions WHERE id = (SELECT min(id) FROM sondage_questions WHERE id > :id )';
  3. $resultat = db()->prepare($query);
  4. $resultat->bindValue(':id',$idQuestion,PDO::PARAM_INT);
  5. $data = $resultat->execute();
  6. $nb_sondage = $resultat->rowCount();
  7. if (!$resultat->execute()) {
  8.   echo '<br>ERREUR select ID ('.$idQuestion.') => v&eacute;rifier la DB';
  9.   } else {
  10.  if (!$nb_sondage == 0) {
  11.   $donnees = $resultat->fetch();
  12.    echo "<form method='post' class='bandeau' action = 'index.php?id=".$_GET['id']."'>";
  13.    echo "<input type='hidden'  name = 'sondage_en_cours' value = '".$donnees['id']."'/>";
  14.    echo "<input type='hidden'  name = 'question' value = '".$donnees['question']."'/>";
  15.    echo "<input type = 'submit' name='choix' value = 'bon' class='bon'/>";
  16.    echo "<input type = 'submit' name='choix' value = 'moyen' class='moyen'/>";
  17.    echo "<input type = 'submit' name='choix' value = 'mauvais' class='mauvais'/>";
  18.    echo "</form>";
  19.  }


 

Reply

Marsh Posté le 04-08-2017 à 09:51:26   

Reply

Marsh Posté le 04-08-2017 à 15:23:02    

Code :
  1. if (!empty($_GET['id'])) {


Ne pas oublier que empty considère "0" comme une valeur vide.
 

Code :
  1. $_GET['id']++;


Il faut se méfier de ++ sur des chaînes (les variables $_GET étant des chaînes), ça peut donner un peu n'importe quoi. Si on veut être sûr d'avoir de l'entier, += 1 est préférable (mais ça ne changera rien)
 
Quand tu parles d'URL fausse, tu fais allusion à la redirection ou à l'action du form ? On n'a pas le code dans son ensemble pour le dire, mais est-ce que $_GET['id']++; a bien lieu avant l'appel de displayQuestions ?


Message édité par pluj le 04-08-2017 à 15:24:16
Reply

Marsh Posté le 04-08-2017 à 15:32:37    

En fait normalement on affiche la question 1.
Une fois qu'on a répondu, on va dans le controleur et on fait le $_GET['id']++ ici.
 
Donc la il sera fait avant l'appel de displayQuestions.
 
Autre soucis  
 
Si je fais ~satisfaction/index.php?id=1 tout fonctionne correctement. C'est à dire qu'on va avoir 1 - 2 - 3 -4 etc...
Cependant si je met ~satisfaction/ on va avoir 1 - 1 - 2 - 3.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed