Partage

QCM à choix multiple

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

12 juin 2018 à 14:49:53

Bonjour tout le monde !

Je suis étudiant en informatique et depuis un certains j'apprend le PHP.
Après mainte et mainte recherche sur le web, j'ai decidé de venir a vous en esperant trouver de aide ici. 

Avant de vous dire mon problème, je vous explice ce que je suis en train de faire. 

Alors, je suis en train de codé un QCM à choix multiple où les questions et réponses viennent d'une base de donnée SQL que j'ai initialisé manuelement en amont. Cesquestions et réponses sont affiché sur une page (sessionUser.php). Il y aura qu'une seul question "par page" (meme si je vais éssayer de les mettre sur une seul page mais les afficher une après l'autre apres chaque valida :

L'affichage des questions sur la page :

Code :
<?php
                // Connexion à la base de données
                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());
                }                
 
                $req = $bdd->query('SELECT * FROM questions WHERE id = 8'); // requette pour afficher une question (teste)               
                $donnees = $req->fetch(); // execution de la requette et récupération des données
            ?>
 
                <form action='QCM_Trait.php' method='POST'> 
 
                    <div class='formulaires01'>
                        <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                        <?php
                            $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête
 
                            $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                            while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                            {                            
                        ?>
 
                                <div class='QuesCheck'> <!-- Dans ce checkbox j'affiche la reponse, dans le name j'ai mis les [] pour pouvoir récuperer les checkbox qui ont été coché et ensuite les traiter sur ma page de traitement et en value je met un booléen qui vient du champ qui se nomme validé dans la table des réponses (1 pour les bonnes réponses et 0 pour les mauvaises)-->
                                    <input type='checkbox' id='questionQCM01' name='question[]' value='<?php echo $donnees['valide'];?>'>
                                    <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                                </div>
 
                        <?php
                            }
                            $req->closeCursor();
                        ?>
                        <div>
                            <button class='valid' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                        </div>
                    </div>
 
                </form>

Alors le problème que j'ai est que je sais pas comment gérer les variables que je récupère pour pouvoir attribuer des notes (+10 la question sachant d'il y aura un dizaine)

J'ai bidouillé quelque petit truck sur ma page de traitement mais rien ne fonctionne correctement. 

Le voici :

Code :
<?php
    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());
    }   
 
    $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)');                
    $donnees = $req->fetch();
 
$note = 0;
/* if (isset($_POST) && !empty($_POST))
{ */
    if (isset($_POST['question']) && !empty($_POST))// récuperation du name plus son id approprier
    {
       /*  $reponse = $_GET['idReponses'];
        echo "La reponse est : ". $reponse; // s'ils sont pareil et si leur contenue sont = 1, echo bonne rep */
        /* print_r($_POST['question']);
        echo "<br>". $_POST['question'][0]. " Eeeeeet ". $_POST['question'][1]. " Eeeeeet encore ". $_POST['question'][2]. "<br>"; // cette echo m'a servi pour voir si je pouvais afficher les valeurs inividuelement */
 
        if (isset($_POST['question'][0])) {
            switch ($_POST['question'][0]) {
                case 0:
                    $valeur1 = 0;
                    break;
                case 1:
                    $valeur1 = 1;
                    break;
                /* 
                default:
                    # code...
                    break; */
            }
        } elseif (isset($_POST['question'][1])) {
             switch ($_POST['question'][1]) {
                case 0:
                    $valeur2 = 0;
                    break;
                case 1:
                    $valeur2 = 1;
                    break;
                /* 
                default:
                    # code...
                    break; */
            }
        } elseif (isset($_POST['question'][2])) {
             switch ($_POST['question'][2]) {
                case 0:
                    $valeur3 = 0;
                    break;
                case 1:
                    $valeur3 = 1;
                    break;
                /* 
                default:
                    # code...
                    break; */
            }
        } elseif (isset($_POST['question'][3])) {
             switch ($_POST['question'][3]) {
                case 0:
                    $valeur4 = 0;
                    break;
                case 1:
                    $valeur4 = 1;
                    break;
                /* 
                default:
                    # code...
                    break; */
            }
            echo "<br>". $valeur1. "<br>";
            echo "<br>". $valeur2. "<br>";
            echo "<br>". $valeur3. "<br>";
            echo "<br>". $valeur4. "<br>";
        }
 
 
 
 
 
 
 
 
        /* 
        foreach ($_POST['question'] as $key => $value) { // le foreach permet de lire les lignes du tableau dans lequel se trouve les valeurs des select coché par l'utilisateur après envoie du formulaire
            echo "La valeur : <em>". $value ."</em> a été coché<br>";
 
 
            switch ($_POST['question']) {
                case $value[0]:
                    $valeur1 = $value[0];
                    echo "<br>". $valeur1. "<br>";
                    break;
                case $value[1]:
                    $valeur2 = $value[1];
                    echo "<br>". $valeur2. "<br>";
                    break;
                case $value[2]:
                    $valeur3 = $value[2];
                    echo "<br>". $valeur3. "<br>";
                    break;
                case $value[3]:
                    $valeur4 = $value[3];
                    echo "<br>". $valeur4. "<br>";
                    break;
 
                default:
                    echo "erreur, aucun variable n'été envoyer";
                    break;
            }
        } */
         if ($value == "1") {
                echo ('bonne rep');
                $note += 10;
                echo "<br>". $note;
            }
        /* if ($reponse == 1) 
        {
            echo ('bonne rep');
            $note += 10;
            echo "<br>". $note;
        } */
    }else
    {
        echo ('mv rep');
        echo "<br>". $note;
    }
/* } */
?>

Je vous prie de m'accorder un peut de votre temps pour pouvoir régler ce problème (le plus rapidement possible car j'ai jusqu'à jeudi pour le fini avec un espace admin). 

Merci d'avance
Bien cordialement 

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
12 juin 2018 à 15:40:00

Salut!

a propos des checkbox: si la checkbox X n'est pas cochée, ta variable $_POST['question'][X] n'existera pas.
Un simple "isset" te permet donc de savoir si la personne a coché la case.

Si tes choix de réponses sont en bdd, je te conseille de nommer tes checkbox avec l'id de ces réponses (et de la question aussi). par exemple name="questionID['reponseID']"
Ca sera plus pratique pour faire les vérification (est-ce la ou les bonnes réponses sont précisées dans ta bdd?)

Ensuite, comme c'est du choix multiple, ton enchainement de elseif ne peut pas fonctionner. Car si la personne a coché la première case et la 3e, ta fonction ne le verra pas.

Il vaut mieux récupérer dans ta base l'id des bonnes réponses et faire un "if isset" sur la présence exclusive des bonnes réponses.

13 juin 2018 à 23:30:30

Bonsoir Ralchimist,

Merci de me répondre et excusez moi de vous répondre si tard et si longtemps en retours. 

Ralchimist a écrit:

Salut!

a propos des checkbox: si la checkbox X n'est pas cochée, ta variable $_POST['question'][X] n'existera pas.
Un simple "isset" te permet donc de savoir si la personne a coché la case.

 Comme vous l'avez dit, j'ai bien fait un if (isset ($_POST['question'][X])) pour savoir si la personne a coché la case. 

Ensuite j'ai fait ceci :

$note = 0;

    if (isset($_POST['question']) && !empty($_POST['question']))// récuperation du name plus son id approprier
    {
       
        print_r($_POST['question']);
        
        
        
        foreach ($_POST['question'] as $key => $value) { // le foreach permet de lire les lignes du tableau dans lequel se trouve les valeurs des select coché par l'utilisateur après envoie du formulaire
            echo "<BR> La valeur : <em>". $value ."</em> a été coché<br>";
            /* echo $key. "<br> ";
            echo $value. "<br>"; */
            if (isset($key) and isset($value)) {
                /* echo "je suis remtrer ici <br>"; */
                
                if ($value != 0) {
                    $choix = true;
                    echo $choix. "<br>";
                    
                } else {
                    $choix = false;
                    echo $choix. "<br>";
                    
                }
            }
        }
        echo "<br>". $choix. "<br>"; // verrification du contenue de la variable $choix

        /* ici je compte récupérer toutes variables $choix (je dis bien "toutes" car la boucle foreach va 
        s'éxécuter en fonction du nombre de checkbox coché, ce qui va créer notre variable choix qui sera 
        egale a "true" si le value = 1 et "false" si le value = 0) 
        
        Le but de cette récupération est de faire en sorte que : 
            Si on a que des "true" va on a une bonne reponse et notre variable note recevra 10 points,
            Si on a que des "false" ou des "false" avec des "true" on a une mauvaise rep et la note reste 
            toujours a 0*/
        
        if ($choix = true) {
            echo ('bonne rep');
            $note = 10;
            echo "<br>". $note;
        } else {
            echo ('mauvaise rep');
            $note;
            echo "<br>". $note; 
        }
        
    }

Mais après réflexion, je me suis posé uen question : " Et si la personne cochait 1 checkboxe  sur les 4 case, et cette case coché est une bonne réponse MAIS la personne envoie le formulaire sans coché la 2ème bonne réponse". Dans ce cas si on se base sur ma récupération(meme si elle fonctionne pas encore, mais disons qu'elle marche), la personne aura quand meme les 10 point.

Donc je me suis dit qu'il fallait que je fasse 2 vérifications sur la page du QCM avant de l'envoyer sur la page de traitement. 

La première : Une verification des du value des réponses qui on pour valeur 1 = vrai et faut = 0 (valeur venant de la bdd : value='<?phpecho$donnees['valide'];?>' )

La deuxième vérification est de faire en sorte, toujours avant l'envoie du QCM sur la page de traitement, que si la paersonne coche 1 ou plus de case vrai et l'envoie alors qu'il y a d'autres (de case vrai) pas coché, bah sur la page de traitement on lui donne 0 pour la question et pareil pour les autres questions que (dans le cas où il y une dizaine de questions par exemple).

Je sais pas si j'ai été assez claire, si non n'hesitez pas a me dire ce que vous comprenez pas. 

Merci :)

14 juin 2018 à 7:03:52

le problème de votre système c'est qu'un petit malin peut regarder le code source de votre questionnaire et se rendre compte que certaines réponses valent 1 et d'autres 0. Il aura vite compris quelles réponses cocher!

Je vous conseille de faire comme cela:

- mettre toutes vos checkbox avec "value=1"

- à la soumission du formulaire, vous refaites la requête pour récupérer les réponses à la question.

$req = $bdd->query('SELECT * FROM reponses WHERE id_question = $idQuestion');
$donnees = $req->fetch();

et ensuite vous vérifier chacune des réponses:

$choix = true; //cette variable restera "true" si la personne a bien répondu
foreach($donnees AS $reponse)
{
     if($reponse['valide']==1 && !isset($_POST['question'][$reponse['id']]) //si la réponse est bonne mais que la personne ne l'a pas cochée
     {
          $choix = false;
          break; //on sort de la boucle s'il manque une bonne réponse
     }
     elseif($reponse['valide']==0 && isset($_POST['question'][$reponse['id']]) //si la réponse est fausse mais que la personne l'a cochée
     {
          $choix = false;
          break; //on sort de la boucle s'il y a une mauvaise réponse de cochée
     }
} if ($choix = true) { echo ('bonne rep'); $note = 10; echo "<br>". $note; } else { echo ('mauvaise rep'); $note; echo "<br>". $note; }

-
Edité par Ralchimist 14 juin 2018 à 7:04:16

14 juin 2018 à 10:50:36

Bonjour Ralchimist,

Merci pour votre réponse; j'ai fais ce que vous m'avez dit :

sur ma page d'affiche (le formulaire) de mon QCM j'ai mis des 1 dans toutes mes values et pour pouvoir récuperer l'idQuestion, je l'ai mis dans un imput type="hidden". 

Voici la page du formulaire : 

 <?php
                // Connexion à la base de données
                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());
                }                

                $req = $bdd->query('SELECT * FROM questions WHERE id = 8'); // requette pour afficher une question (teste)               
                $donnees = $req->fetch(); // execution de la requette et récupération des données
            ?>

                <form action='QCM_Trait.php' method='POST'> 
                    
                    <div class='formulaires01'>
                        <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                        <input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'> <!-- l'envoie de l'id question -->
                        
                        <?php
                            $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

                            $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                            while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                            {                            
                        ?>
                            <div class='QuesCheck'> 
                                <input type='checkbox' id='questionQCM' name='question[]' value='1'>
                                <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                            </div>

                        <?php
                            }
                            $req->closeCursor();
                        ?>
                        
                        <div>
                            <button class='valid' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                        </div>
                    </div>

                </form>

Et sur ma page de traitement, j'ai fais comme vous l'avez dit, j'ai refais la réponse pour récupérer les réponses à la question :

<?php
    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());
    }   

    $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)');                
    $donnees = $req->fetch();

Ensuite j'ai vérifier chacune de mes réponses comme vous l'avez dit dans la boucle foreach :

$choix = true;
foreach ($donnees as $reponse) {
if ($reponse['valide'] ==1 && !isset($_POST['question'][$reponse['id']])) {
                $choix = false;
                break;
            } elseif ($reponse['valide'] ==0 && !isset($_POST['question'][$reponse['id']])) {
                $choix = false;
                break;
            }    
        }
        if ($choix = true) {
            echo ('bonne rep');
            $note = 10;
            echo "<br>". $note;
        } else {
            echo ('mauvaise rep');
            $note;
            echo "<br>". $note; 
        }

Mais j'ai eu pas mal de petites erreurs de syntaxe dans le if. J'ai eu ça comme réponse de PHP :

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 19

Warning: Illegal string offset 'id' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 19

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 22

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 19

Warning: Illegal string offset 'id' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 19

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 22

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 19

Warning: Illegal string offset 'valide' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 22

Warning: Illegal string offset 'id' in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 22
bonne rep
10

Voici le code en entier : 

<?php
    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());
    }   

    $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)');                
    $donnees = $req->fetch();

$choix = true; 
        
        foreach ($donnees as $reponse) { // le foreach permet de lire les lignes du tableau dans lequel se trouve les valeurs des select coché par l'utilisateur après envoie du formulaire
            //print_r($reponse);
            if ($reponse['valide'] ==1 && !isset($_POST['question'][$reponse['id']])) {
                $choix = false;
                break;
            } elseif ($reponse['valide'] ==0 && !isset($_POST['question'][$reponse['id']])) {
                $choix = false;
                break;
            }    
        }
        if ($choix = true) {
            echo ('bonne rep');
            $note = 10;
            echo "<br>". $note;
        } else {
            echo ('mauvaise rep');
            $note;
            echo "<br>". $note; 
        }
?>






14 juin 2018 à 11:02:53

C'est le format de ce que tu récupères dans "donnees" qui ne va pas avec le foreach.

remplace

foreach ($donnees as $reponse)

par

while($donnees = $req->fetch())

 et adapte les variables dans le if

-
Edité par Ralchimist 14 juin 2018 à 11:04:31

14 juin 2018 à 11:34:10

Effectivement vous aviez raison, c'était bien le format de la récupération dans "donnees "qui n'allait pas avec le foreach.

J'ai plus les erreurs après avoir remplacer le :

foreach ($donnees as $reponse)

par

while($donnees = $req->fetch())

Mais quelque soit la case que je coche sur la page du QCM, dans le formulaire; après envoie, j'ai toujours une "bonne réponse" et mon "$note" est toujours = 10. 

Est-parce que les value de mes input sont tous tout le temps = à 1 ? 

on peut le voir ici : 

while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                            {                            
                        ?>
                            <div class='QuesCheck'> 
                                <input type='checkbox' id='questionQCM' name='question[]' value='1'>
                                <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                            </div>

                        <?php
                            }
                            $req->closeCursor();
                        ?>



14 juin 2018 à 11:40:07

non, la valeur de l'input n'intervient pas du tout dans le contrôle des bonnes réponses.

vous pouvez me montrer le contenu de votre while?



14 juin 2018 à 11:58:01

D'accord, voici un ctrl-u de mon while :

form action='QCM_Trait.php' method='POST'>
   
  <div class='formulaires01'>
  <p><em>Q. : </em>Quel temps fait-il aujourd’hui </p> <!-- Affichage d'une question (teste) -->
  <input type='hidden' name='idQuestion' value='8'> <!-- l'envoie de l'id question -->
   
  <div class='QuesCheck'>
  <input type='checkbox' id='questionQCM' name='question[]' value='1'>
  <label for='questionQCM'>Beau</label>
  </div>
   
  <div class='QuesCheck'>
  <input type='checkbox' id='questionQCM' name='question[]' value='1'>
  <label for='questionQCM'>Moche</label>
  </div>
   
  <div class='QuesCheck'>
  <input type='checkbox' id='questionQCM' name='question[]' value='1'>
  <label for='questionQCM'>Ensoleiller </label>
  </div>
   
  <div class='QuesCheck'>
  <input type='checkbox' id='questionQCM' name='question[]' value='1'>
  <label for='questionQCM'>Pluiviale</label>
  </div>
   
   
  <div>
  <button class='valid' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
  </div>
  </div>
   
  </form>
14 juin 2018 à 12:44:21

modifiez le while de contrôle comme ceci pour faire correspondre les réponses.

$i = 0;
while($donnees = $req->fetch()) { if ($donnees ['valide'] ==1 && !isset($_POST['question'][$i])) { $choix = false; break; }
elseif ($donnees ['valide'] ==0 && isset($_POST['question'][$i])) { $choix = false; break; }
$i++;

}



14 juin 2018 à 12:57:57

j'ai modifier comme vous l'avez dit mais quoique je coche j'ai toujours une bonne réponse.

$choix = true; 
$i = 0; 
        while ($donnees = $req->fetch()) { // le foreach permet de lire les lignes du tableau dans lequel se trouve les valeurs des select coché par l'utilisateur après envoie du formulaire
            //print_r($reponse);
            if ($donnees['valide'] ==1 && !isset($_POST['question'][$i])) {
                $choix = false;
                break;
            } elseif ($donnees['valide'] ==0 && isset($_POST['question'][$i])) {
                $choix = false;
                break;
            }   
            $i++; 
        }
        if ($choix = true) {
            echo ('bonne rep');
            $note = 10;
            echo "<br>". $note;
        } else {
            echo ('mauvaise rep');
            $note;
            echo "<br>". $note; 
        }



14 juin 2018 à 13:01:51

il manque un = sur le dernier if

if ($choix == true)

14 juin 2018 à 13:26:16

D'accord c'est fait,

J'ai aussi remarqué que j'avais pas appeler mon :

<input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'>

Et modifier :

$req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)');

Par :

$req = $bdd->query('SELECT * FROM reponses WHERE id_question = $idQuestion');

Comme vous me l'aviez dit un peut plus haut.

Du coup je l'ai modifier. 

Mais ça marchais pas car ma requete est en PDO. Du coup j'ai fais une requette préparer comme ceci :

$idQuestion = $_POST['idQuestion'];

$req = $bdd->prepare('SELECT * FROM reponses WHERE id_question:idQuestion');                
    $req->execute(['idQuestion' => $idQuestion]);

Mais j'ai une erreur de syntaxe PDO dont je vois pas d'où ça vient :

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 ':idQuestion' at line 1 in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php:15 Stack trace: #0 C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php(15): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 15



14 juin 2018 à 13:33:36

il manque le = dans la condition

WHERE id_question=:idQuestion



14 juin 2018 à 13:58:45

Aah bien vu merci ! :)

Maintenant j'ai que des mauvaise réponse et la note à 0 quelque soit la réponse coché. 

Je vous montre tout le code en entier pour une récap.

Code formulaire QCM :

<?php
                // Connexion à la base de données
                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());
                }                

                $req = $bdd->query('SELECT * FROM questions WHERE id = 8'); // requette pour afficher une question (teste)               
                $donnees = $req->fetch(); // execution de la requette et récupération des données
            ?>

                <form action='QCM_Trait.php' method='POST'> 
                    
                    <div class='formulaires01'>
                        <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                        <input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'> <!-- l'envoie de l'id question -->
                        
                        <?php
                            $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

                            $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 8)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                            while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                            {                            
                        ?>
                            <div class='QuesCheck'> 
                                <input type='checkbox' id='questionQCM' name='question[]' value='1'>
                                <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                            </div>

                        <?php
                            }
                            $req->closeCursor();
                        ?>
                        
                        <div>
                            <button class='valid' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                        </div>
                    </div>

                </form>

Code page Traitement QCM :

<?php
$idQuestion = $_POST['idQuestion'];

    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());
    }   

    $req = $bdd->prepare('SELECT * FROM reponses WHERE id_question = :idQuestion');                
    $req->execute(['idQuestion' => $idQuestion]);

$choix = true; 
$note = 0;
$i = 0; 
        while ($donnees = $req->fetch()) { // le foreach permet de lire les lignes du tableau dans lequel se trouve les valeurs des select coché par l'utilisateur après envoie du formulaire
            //print_r($reponse);
            if ($donnees['valide'] ==1 && !isset($_POST['question'][$i])) {
                $choix = false;
                break;
            } elseif ($donnees['valide'] ==0 && isset($_POST['question'][$i])) {
                $choix = false;
                break;
            }   
            $i++; 
        }
        if ($choix == true) {
            echo ('bonne rep');
            $note = 10;
            echo "<br>". $note;
        } else {
            echo ('mauvaise rep');
            $note;
            echo "<br>". $note; 
        }
?>




14 juin 2018 à 15:00:30

pouvez vous cocher toutes les cases et mettre quelque chose comme ça dans le traitement:
foreach($_POST['question'] AS $reponse)
{
   echo $reponse;
}

(c'est pour vérifier qu'on récupère bien toutes les réponses cochées.)
14 juin 2018 à 15:18:09

quand je fait comme vous l'avez dit avec le foreach que vous avez dit, j'ai : 1111

Ce qui veut dire que je récupère bien les value de mes input 

14 juin 2018 à 15:25:28

ok c'est déjà ça^^

Et maintenant ça:

if ($donnees['valide'] ==1 && !isset($_POST['question'][$i])) {
                $choix = false;
echo "bonne réponse $i manquante<br />"; break; } elseif ($donnees['valide'] ==0 && isset($_POST['question'][$i])) { $choix = false;
echo "mauvaise réponse $i cochée<br />"; break; }



-
Edité par Ralchimist 14 juin 2018 à 15:26:04

14 juin 2018 à 15:45:57

Il faut mettre ce if dans le foreach ou dans le while précédent ou tout seul ?

j'ai éssayé les 3 cas mais j'ai a chaque fois cette erreur de synthaxe :

Parse error: syntax error, unexpected '$choix' (T_VARIABLE) in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\QCM_Trait.php on line 49

14 juin 2018 à 15:48:50

en fait il faut juste ajouter les "echo" dans le if de la page traitement

C'est pour voir comment réagit le if que nous avons mis.

14 juin 2018 à 16:00:16

Ahh ok d'accord :D

j'ai rajouté les echo. j'ai quelque chose d’intéressant :

- quand quand je coche, n'import quel case, j'ai : mauvaise réponse 0 cochée

- et quand je coche rien du tout, j'ai : bonne réponse 1 manquante

bizarre !

14 juin 2018 à 16:13:02

Non, cela semble logique. (si la première réponse est fausse et que la 2e est bonne)
Dans ton 1er cas, comme tu as coché la 1e case et qu'elle est fausse, il te dit "mauvaise réponse 0 cochée"
Et dans le 2e cas: tu n'as rien coché donc il te le dit qu'il manque la première des bonnes réponses :

quelles sont les bonnes réponses pour cette question?

14 juin 2018 à 16:31:06

La bonne réponse est quand je ne coche rien, il me dit "bonne réponse 1 manquante"

Après n'import quel case que je coche  (que je coche les bonne réponse ou pas) il me dit : mauvaise réponse 0 cochée

14 juin 2018 à 16:40:24

ah ok je vois d'où ça vient. En fait l'index des réponses récupérées dans le $_POST['question'] change car dans la page traitement, elle ne contient que les cases cochées! Il faut donc utiliser l'id des réponses.

Dans votre formulaire, mettez ce name pour vos checkbox:

name='question[<?php $donnees['id']; ?>]'


et dans le traitement, remplacez les  $_POST['question'][$i] par

$_POST['question'][$donnees['id']]



14 juin 2018 à 16:47:42

Vous voulez dire plutot name ='question [<?php echo $donnees['id']; ?>]' ?
14 juin 2018 à 16:48:38

oui avec le echo ça ira mieux ^^
14 juin 2018 à 17:49:03

Merci Beaucoup, ça marche nickel :D 

Mais maintenant j'ai un autre petit problème toujours avec le QCM. Je voudrais faire une boucle (j'ai pris la boucle while comme pour l'affichage des réponses) qui affiche toutes les questions de la base avec leurs réponses sur la page QCM. MAIS, :D mais, a l'intérieur de cette boucle j'ai voulu mettre une condition IF qui affiche la première question et ses réponses. et ensuite, après validation cette première question, j'affiche une autre question et ses réponses (cette autre question et ses réponses s'affichent a chaque passage de la boucle while) que si la personne a validé le formulaire en cliquant sur le bouton id='boutonValide'. Ensuite de suite, jusqu'à la fin de la boucle while.

Je vous montre ma page QCM dans lequel il y a des commentaires qui expliquent : 

 <?php
                // Connexion à la base de données
                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());
                }                

                $req = $bdd->query('SELECT * FROM questions WHERE id = 2'); // requette pour afficher une question (teste)               
                $donnees = $req->fetch(); // execution de la requette et récupération des données
                
                while ($donnees = $req->fetch()) // boucle parmetant d'affiche toutes les questions
                {
                
            ?>

                    <form action='QCM_Trait.php' method='POST'> 
                        
                        <div class='formulaires01'>
                        
                            <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                            <input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'> <!-- l'envoie de l'id question -->
                        <?php
                        if (#boutonValide = submit) // If qui affiche la première question et ses réponses. Mais qui affiche les autres questions et reponses (autres questions et réponses s'affiche grace a la boucle while) que si la personne a validé le formulaire en cliquant sur le bouton id='boutonValide'. insuite de suite, jusqu'à la fin de la boucle while.
                        {
                        ?>
                            <?php
                                $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

                                $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 2)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                                while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                                {                            
                            ?>
                                <div class='QuesCheck'> 
                                    <input type='checkbox' id='questionQCM' name='question[<?php echo $donnees['id']; ?>]' value='1'>
                                    <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                                </div>

                            <?php
                                }
                                $req->closeCursor();
                            ?>
                            
                            <div>
                                <button class='valid' id='boutonValide' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                            </div>

                        <?php
                        }   // Fin du if #boutonValide
                        ?>
                        </div> <!-- Fin div class formulaire01 -->

                    </form>
            <?php
                }
            ?>

Là où j'ai du mal, c'est cette condition If que je sais pas comment le faire.

En tout cas Déjà un GRAND MERCI pour m'avoir aider a résoudre le premier Grand problème ;)

14 juin 2018 à 17:58:21

là tu dois d'abord réfléchir à la conception globale de ton questionnaire. Je te conseille de prendre un peu de temps pour déterminer ce que tu veux faire.

Y a-t-il un intérêt à devoir valider chaque question une à une?
Est-ce qu'on peut revenir sur la question précédente?
Est-ce que tu stockes les réponses dans ta bdd ou juste la note finale?
etc.

14 juin 2018 à 18:12:14

Pour la conception Globale du QCM, j'y ai déjà pensé.

Pour tout vous expliquez et au passage répondre a vos question; l'intérêt de valider chaque question une à une est que la personne ne peut pas tricher. Donc elle ne pourra pas revenir en arrière. Oui je compte stocker les réponses de la personne à la fin sur la bdd avec la note a chaque réponses et la note total. 

Bon après je peux juste afficher toutes les questions sur une seul page et stocker les réponses de la personne à la fin sur la bdd avec la note a chaque réponses et la note total. Si j'arrive a faire ça je serai déjà superbe.

Je dis ça parce que je doit finir ce QCM aujourd'hui pour pouvoir le rendre demain, et le mettre en ligne sur un serveur. 

Pour afficher toutes les questions sur la meme page j'ai fait ça : 

<?php
                // Connexion à la base de données
                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());
                }                

                $req = $bdd->query('SELECT * FROM questions'); // requette pour afficher une question (teste)               
                //$donnees = $req->fetch(); // execution de la requette et récupération des données
                
                while ($donnees = $req->fetch()) // boucle parmetant d'affiche toutes les questions
                {
                
            ?>

                    <form action='QCM_Trait.php' method='POST'> 
                        
                        <div class='formulaires01'>
                        
                            <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                            <input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'> <!-- l'envoie de l'id question -->
                        <!-- < ? php
                        if (#boutonValide = submit) // If qui affiche la première question et ses réponses. Mais qui affiche les autres questions et reponses (autres questions et réponses s'affiche grace a la boucle while) que si la personne a validé le formulaire en cliquant sur le bouton id='boutonValide'. insuite de suite, jusqu'à la fin de la boucle while.
                        {
                        ?> -->
                            <?php
                                $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

                                $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 2)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                                while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                                {                            
                            ?>
                                <div class='QuesCheck'> 
                                    <input type='checkbox' id='questionQCM' name='question[<?php echo $donnees['id']; ?>]' value='1'>
                                    <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                                </div>

                            <?php
                                }
                                $req->closeCursor();
                            ?>
                            
                            <div>
                                <button class='valid' id='boutonValide' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                            </div>

                        <!-- < ?php
                        }   // Fin du if #boutonValide
                        ?> -->
                        </div> <!-- Fin div class formulaire01 -->

                    </form>
            <?php
                }
            ?> 

J'ai mis l'éxécution de la requette dans une boucle, comme ceci :

//$donnees = $req->fetch(); // execution de la requette et récupération des données
                
                while ($donnees = $req->fetch()) // boucle parmetant d'affiche toutes les questions
                {

Ensuite j'ai mis tout le formulaire dans la boucle, comme ceci : 

 <form action='QCM_Trait.php' method='POST'> 
                        
                        <div class='formulaires01'>
                        
                            <p><em>Q. : </em><?php echo $donnees['question'];?> </p> <!-- Affichage d'une question (teste) -->
                            <input type='hidden' name='idQuestion' value='<?php echo $donnees['id'];?>'> <!-- l'envoie de l'id question -->
                        <!-- < ? php
                        if (#boutonValide = submit) // If qui affiche la première question et ses réponses. Mais qui affiche les autres questions et reponses (autres questions et réponses s'affiche grace a la boucle while) que si la personne a validé le formulaire en cliquant sur le bouton id='boutonValide'. insuite de suite, jusqu'à la fin de la boucle while.
                        {
                        ?> -->
                            <?php
                                $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

                                $req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 2)'); // requette pour afficher la réponse assosié a sa question. Avec une cle étrangère permetant d'aller chercher l'id sur la table question               
                                while ($donnees = $req->fetch()) // boucle permetant d'afficher les reponses
                                {                            
                            ?>
                                <div class='QuesCheck'> 
                                    <input type='checkbox' id='questionQCM' name='question[<?php echo $donnees['id']; ?>]' value='1'>
                                    <label for='questionQCM'><?php echo $donnees['reponse'];?></label>
                                </div>

                            <?php
                                }
                                $req->closeCursor();
                            ?>
                            
                            <div>
                                <button class='valid' id='boutonValide' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
                            </div>

                        <!-- < ?php
                        }   // Fin du if #boutonValide
                        ?> -->
                        </div> <!-- Fin div class formulaire01 -->

                    </form>

Et en fin je ferme la boucle while, comme ceci : 

<?php
     }
?> 


Mais pour pouvoir faire la boucle sur toutes les question et donc affiché toutes les réponses de chaque questions, j'ai modifié la requête qui était comme ça avant :

$req = $bdd->query('SELECT * FROM questions WHERE id = 2');

comme ceci :

$req = $bdd->query('SELECT * FROM questions'); 

Mais du coup je me dit que je doit aussi modifier la requête d'affichage des réponses adapté qui était avant comme ça avant :

$req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions where id= 2)');

Comme ceci :

$req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions)');

Mais une erreur : 

Fatal error: Uncaught PDOException: SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\sessionUser.php:127 Stack trace: #0 C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\sessionUser.php(127): PDO->query('SELECT * FROM r...') #1 {main} thrown in C:\MAMP\htdocs\Projet Entreprise\Projet\Projet0.3\sessionUser.php on line 127

Je pense que cette erreur vient du fait que dans cette requête :

$req = $bdd->query('SELECT * FROM reponses WHERE id_question =(select id from questions)');

Il manque l'ID de la question.





-
Edité par JhessyIsmael 14 juin 2018 à 18:35:29

15 juin 2018 à 10:04:31

Salut!

J'arrive peut-être trop tard...

Effectivement l'erreur vient de ta requete. Il faut que tu mettes:

idQuestion = $donneesQuestion['id'];
$req2 = $bdd->prepare('SELECT * FROM reponses WHERE id_question =(select id from questions where id=:idQuestion)');
$req2->execute(['idQuestion' => $idQuestion]);



De plus il faut que tu changes le nom de tes variables dans ta 2e boucle car sinon ton premier while utilise la variable $req mais le problème c'est que tu la modifies dans la boucle...

while ($donneesQuestion = $req->fetch()) // boucle permetant d'affiche toutes les questions
     {
          $req2 = "ta requete pour récupérer tes réponses
          while ($donneesReponse = $req2->fetch()) // boucle permetant d'affiche toutes les réponses
          {
          }

}

t

QCM à choix multiple

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown