Partage
  • Partager sur Facebook
  • Partager sur Twitter

QCM à choix multiple

QCM à choix multiple affiche questions et réponses, venant de la bdd

    2 juillet 2018 à 8:40:39

    Bonjour,

    à chaque passage dans votre boucle parent, vous faites le foreach sur l'ensemble de $_POST['question'].
    Donc forcément il vous enregistre tout plusieurs fois!

    Remplacez $_POST['question'] par $_POST['question'][$idQuestion] (vous pourrez donc enlever la boucle foreach ($value as $keys => $val) )

    Et ensuite pour votre requête, vous utilisez la variable $idReponse qui est initialisée dans une autre boucle while. (donc elle sera fixe dans votre foreach ...)

    PS: pensez à utiliser les requêtes préparées pour plus de sécurité.

    -
    Edité par Ralchimist 2 juillet 2018 à 10:19:54

    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2018 à 13:52:28

      Merci pour votre réponse,

      J'ai pu corriger l'erreur et simplifier le code (super !) :)

      Je rencontre un problème avec ma syntaxe PDO dans ma requette mais j'arrive a voir d'où vient le problème :

      foreach ($_POST['question'][$donneesQuestions['id']] as $key => $value) { // dans ce premier boucle foreach je récupère l'id de la question
                      echo $key . " --> l'id de la question"; // l'id de la question
                      echo "<br>";
                      echo $value;  
                      echo "<br>";                    // la réponse
                          // requette ici pour insérer ligne par ligne dans la bdd
                          echo $prenomUser;
                          echo $nomUser;
                          $reqInsertReponse = $bdd->prepare('INSERT INTO reponseUser WHERE prenom_User = :prenomUser, nom_User = :nomUser, id_Question = :idQuestion, id_Reponse = :idReponse, reponse_User = :reponseUser, note_User = :note');
                          $reqInsertReponse->execute([
                              'prenomUser' => $prenomUser,
                              'nomUser' => $nomUser,
                              'idQuestion' => $idQuestion,
                              'idReponse' => $idReponse,
                              'reponseUser' => $value,
                              'note' => $note
                          ]);
                          echo "<br><br> Insertion réussi";
                      
                  }

      l'érreur PDO c'est :

      Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE prenom_User = 'Daniel' AND nom_User = 'Schaefer' AND id_Question = '1' AND' at line 1 in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php:69 Stack trace: #0 C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php(69): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 69

      Voyez-vous d'ou ça vien svp ?

      • Partager sur Facebook
      • Partager sur Twitter
        2 juillet 2018 à 14:29:03

        il vous faut revoir la syntaxe complète des requêtes INSERT:

        http://sql.sh/cours/insert-into

        et attention, vous avez laissé la variable $idReponse qui ne correspond à rien dans ce foreach.

        • Partager sur Facebook
        • Partager sur Twitter
          2 juillet 2018 à 16:49:20

          La syntaxe de la requette INSERT que vous m'avez dit d'aller voir : http://sql.sh/cours/insert-into est pour la version classique : 

          INSERT INTO client (prenom, nom, ville, age)
           VALUES
           ('Rébecca', 'Armand', 'Saint-Didier-des-Bois', 24),
           ('Aimée', 'Hebert', 'Marigny-le-Châtel', 36),
           ('Marielle', 'Ribeiro', 'Maillères', 27),
           ('Hilaire', 'Savary', 'Conie-Molitard', 58);

          Mais moi je cherche la version PDO, et j'ai trouver ça sur le net :

          $sth = $dbh->prepare('INSERT INTO matable (champ1,champ2) VALUES (?,?),(?,?),(?,?)');
          $sth->execute(array(array('1','un'),array('2','deux'),array('3','trois'));

          et je l'ai donc adapter a mon code comme ceci :

          $reqInsertReponse = $bdd->prepare("INSERT INTO reponseUser WHERE (prenom_User, nom_User, id_Question, id_Reponse, reponse_User, note_User) VALUES ('prenomUser', 'nomUser', 'idQuestion', 'reponseUser', 'note')");
                              $reqInsertReponse->execute([
                                  'prenomUser' => $prenomUser,
                                  'nomUser' => $nomUser,
                                  'idQuestion' => $idQuestion,
                                  'idReponse' => $idReponse,
                                  'reponseUser' => $value,
                                  'note' => $note
                              ]);

          j'ai toujour le meme erreur, donc je l'ai encore réadapter comme ceci :

          $reqInsertReponse = $bdd->prepare("INSERT INTO reponseUser WHERE (prenom_User, nom_User, id_Question, id_Reponse, reponse_User, note_User) VALUES ('prenomUser', 'nomUser', 'idQuestion', 'reponseUser', 'note')");
                              $reqInsertReponse->execute(
                                  array('prenomUser' => $prenomUser),
                                  array('nomUser' => $nomUser),
                                  array('idQuestion' => $idQuestion),
                                  array('idReponse' => $idReponse),
                                  array('reponseUser' => $value),
                                  array('note' => $note)
                              );

          Mais erreur parce que j'ai mis 6 paramètre dans l’exécute. Du coup j'ai tout mis dans un seul tableau comme ceci :

          $reqInsertReponse = $bdd->prepare("INSERT INTO reponseUser WHERE (prenom_User, nom_User, id_Question, id_Reponse, reponse_User, note_User) VALUES ('prenomUser', 'nomUser', 'idQuestion', 'reponseUser', 'note')");
                              $reqInsertReponse->execute(
                                  array('prenomUser' => $prenomUser,
                                          'nomUser' => $nomUser,
                                          'idQuestion' => $idQuestion,
                                          'idReponse' => $idReponse,
                                          'reponseUser' => $value,
                                          'note' => $note)
                              );

          Mais j'ai toujour cette érreur : 

          Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (prenom_User, nom_User, id_Question, id_Reponse, reponse_User, note_User) ' at line 1 in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php:69 Stack trace: #0 C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php(69): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 69

          Je n'arrive vraiment pas a voir d'où viens le problème 





          • Partager sur Facebook
          • Partager sur Twitter
            2 juillet 2018 à 17:52:03

            Salut !

            Attention : lors de l'adaptation de "la version PDO trouvée sur le net" vers la version de ton code, il y a le mot-clé WHERE qui s'est invité avant la liste des champs pour lesquels des valeurs seront insérées, et les marqueurs ont été remplacés par des chaînes de caractères. Un peu plus d'informations dans cet autre sujet auquel ton problème m'a fait penser  ^^

            -
            Edité par Ymox 2 juillet 2018 à 17:53:16

            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2018 à 18:39:34

              Bonsoir, 

              J'ai regardé sur l'autre article, j'ai bien compris le problème qui est : On met des virgules entre les valeurs qu'on met a jours et des AND entre les valeurs après un WHERE. 

              J'ai donc fais ceci :

              $reqInsertReponse = $bdd->prepare("INSERT INTO reponseUser (prenom_User = :prenomUser, nom_User = :nomUser, reponse_User = :reponseUser, note_User = :note WHERE id_Question = :idQuestion AND id_Reponse = :idReponse");
                                  $reqInsertReponse->execute(
                                      array('prenomUser' => $prenomUser,
                                              'nomUser' => $nomUser,
                                              'reponseUser' => $value,
                                              'note' => $note,
                                              'idQuestion' => $idQuestion,
                                              'idReponse' => $idReponse)
                                  );

              Mais j'ai toujours cette erreur PDO :

              Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 'Daniel', nom_User = 'Schaefer', reponse_User = 'La couleur du cheval blanc es' at line 1 in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php:69 Stack trace: #0 C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php(69): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 69

              PS. : je suis désolé d'avance si je vous pose des questions jusqu'à tard ce soir car je doit régler ces petit problème avant demain matin. Et je pense qu'il me reste pas beaucoup de chose pour finir de toute façon. Merci d'avance quand même pour votre patience et toutes vos réponses. 

              Voici le code en entier :

              <?php
              session_start();
              $nomUser = $_SESSION['user']['nom'];
              $prenomUser = $_SESSION['user']['prenom'];
              
                  try
                  {
                      $bdd = new PDO('mysql:host=localhost;dbname=projet_avenirfr;charset=utf8', 'root', 'root');
                      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                  }
                  catch(Exception $e)
                  {
                      die('Erreur : '.$e->getMessage());
                  }   
                  $reqQuestion = $bdd->query('SELECT * FROM questions');
                  
                  $note = 0;
                  
              
                  while ($donneesQuestions = $reqQuestion->fetch()) // boucle parmetant d'affiche toutes les questions
                      {
                          $idQuestion = $donneesQuestions['id'];
                          $reqReponse = $bdd->prepare('SELECT * FROM reponses WHERE id_question = :idQuestion');                
                          $reqReponse->execute(['idQuestion' => $donneesQuestions['id']]);
                          
                          $choix = true;
                          $i = 0; 
              
                          while ($donneesReponses = $reqReponse->fetch()) // boucle permetant d'afficher toutes les reponses assosiées
                              {
                                  $idReponse = $donneesReponses['id'];
                                  //print_r($reponse);
                                  if ($donneesReponses['valide'] ==1 && !isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                                      $choix = false;
                                      //echo "bonne réponse $i manquante<br/>";
                                      break;
                                  } elseif ($donneesReponses['valide'] ==0 && isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                                      $choix = false;
                                      //echo "mauvaise réponse $i cochée<br/>";
                                      break;
                                  }   
                                  $i++;
                              }
                          if ($choix == true) {
                              //echo ('bonne rep');
                              $note += 10;
                             // echo "<br>". $note;
                          } else {
                              //echo ('mauvaise rep');
                              $note += 0;
                              //echo "<br>". $note; 
                          }
                          $reqReponse->closeCursor();
                          foreach ($_POST['question'][$donneesQuestions['id']] as $key => $value) { // dans ce premier boucle foreach je récupère l'id de la question
                              echo $key . " --> l'id de la question"; // l'id de la question
                              echo "<br>";
                              echo $value;  
                              echo "<br>";                    // la réponse
                                  // requette ici pour insérer ligne par ligne dans la bdd
                                  echo $prenomUser;
                                  echo $nomUser;
                                  $reqInsertReponse = $bdd->prepare('INSERT INTO reponseUser (prenom_User = :prenomUser, nom_User = :nomUser, reponse_User = :reponseUser, note_User = :note WHERE id_Question = :idQuestion AND id_Reponse = :idReponse');
                                  $reqInsertReponse->execute(array(
                                              'prenomUser' => $prenomUser,
                                              'nomUser' => $nomUser,
                                              'reponseUser' => $value,
                                              'note' => $note,
                                              'idQuestion' => $idQuestion,
                                              'idReponse' => $idReponse)
                                  );
                                  echo "<br><br> Insertion réussi";
                              
                          }
                          $reqInsertReponse->closeCursor();
                          
                      } 
                       echo "<br>". $note . "<br><br>";
                      
              ?>



              -
              Edité par JhessyIsmael 2 juillet 2018 à 21:41:23

              • Partager sur Facebook
              • Partager sur Twitter
                2 juillet 2018 à 22:22:17

                La requête d'insertion n'est toujours pas correcte, on devrait avoir un schéma INSERT INTO nom de la table (liste des champs qui seront insérés) VALUES (liste des valeurs, dans le même ordre et le même nombre que la liste des champs). Il ne faudrait pas hésiter à aller voir d'autres ressources quand la première n'est pas compréhensible.

                -
                Edité par Ymox 2 juillet 2018 à 22:24:14

                • Partager sur Facebook
                • Partager sur Twitter
                  3 juillet 2018 à 18:33:56

                  Bonjour, Effectivement c'est ce que j'ai fais et j'ai pu régler le problème, comme je suis mon tel là et que j'ai pas mon pc avec mon. Je vous montrerai la solution que j'ai trouvé plutard ce soir. 

                  • Partager sur Facebook
                  • Partager sur Twitter

                  QCM à choix multiple

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown