IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

QCM, récupération de données pour mettre sur une bdd


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Par défaut QCM, récupération de données pour mettre sur une bdd
    Bonjour,

    J'ai un qcm où l'utilisateur peut avoir plusieurs choix pour une question. Le qcm fonctionne bien, j'affiche les questions et le réponse sans problème, j'arrive a noté l'utilisateur en fonction de ses réponses.

    je cherche a enregistrer l'ID de chaque questions et l'ID (des) de la réponse(s) de l'utilisateur sur ma base de donné dans le champ reponseUser. Ma base de donnée a 3 champs : question, reponse, reponseUser.



    Je vous montrer le code de la page de traitement du qcm (qcmTrait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    <?php
    //session_start();
    // $nomUser = $_SESSION['user']['nom'];
    // $prenomUser = $_SESSION['user']['prenom'];
    // echo $nomUser;
    // echo "<br><br>".$prenomUser;
    var_dump($_POST['question']);
        try
        {
            $bdd = new PDO('mysql:host=localhost;dbname=qcm;charset=utf8', '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;
    			$idReponse;
                while ($donneesReponses = $reqReponse->fetch()) // boucle permetant d'afficher toutes les reponses assosiées
                {
                    $idReponse = $donneesReponses['id'];
                    //print_r($reponse);
                    if ($donneesReponses['Validation'] ==1 && !isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                        $choix = false;
                        echo "<br>bonne réponse : $i manquante<br/>";
                        break;
                    } elseif ($donneesReponses['Validation'] ==0 && isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                        $choix = false;
                        echo "<br>mauvaise réponse : $i cochée";
                        break;
                    }  
                    $i++;
                }
                    //print_r($donneesQuestions);
                    //echo "testest";
     
                if ($choix == true) {
                    echo ('<br>bonne rep');
                    $note += 10;
                    echo "<br>". $note. " --> la note += $note";
                } else {
                    echo ('<br>mauvaise rep');
                    $note += 0;
                    echo "<br>". $note. " --> la note += $note";
                }
     
                $reqReponse->closeCursor();
                $idUser = $_POST['question'];
                // test $_POST['question'][$donneesQuestions['id']]
                echo "<br> la taile du tableau 'question' : ". sizeof($idUser);
                    for ($i=0; $i <= sizeof($idUser) ; $i++) { 
                        echo "<br>".$i." <~~~~~~<br>";    
                        // echo $idUser[$i];
                    }
     
     
                    echo " <br> ";
                    echo " <br> ---------------------------";
                    print_r($_POST['question']); // je recupère l'id des réponses choisis par l'user
                    echo "------------------------ <br> ";
     
                foreach ($idUser as $key => $value) {
                    echo " <br> ";
                    echo $key;
                    echo " <br> ";
                    // echo $value;
                    echo " <br> ";
                }
                echo " <br> ";
                foreach ($_POST['question'][$donneesQuestions['id']] as $key => $value) { // dans ce premier boucle foreach je récupère l'id de la question
                    echo "<br>".$key . " --> l'id de la réponse"; // l'id de la question
                    echo " <br> ";
                    echo $value. " --> ici on a le value des réponses qui sont tous = 1 "; 
                    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 (reponse_User= :reponseUser, note_User= :note, id_Question= :idQuestion, id_Reponse= :idReponse');
                        // $reqInsertReponse->execute([
    					// 	'reponseUser' => $value,
    					// 	'note' => $note,
    					// 	'idQuestion' => $idQuestion,
    					// 	'idReponse' => $idReponse
    					// ]);
                        // echo "<br><br> Insertion réussi";
     
                }
                //$reqInsertReponse->closeCursor();
     
            }
             echo "<br>". $note . "<br><br>";
     
    ?>
    Je vous montrer le code du QCM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
        <title>QCM M2L</title>
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css">
        <link rel="stylesheet" type="text/css" href="qcmTest.css">
    </head>
    <body>
     
     
    	<center> 
     
    	<h1> QCM de la M2L </h1> 
     
    	<div id="questionnaire">
    		<?php
    			// Connexion à la base de données
    			try
    			{
    				$bdd = new PDO('mysql:host=localhost;dbname=qcm;charset=utf8', 'root', '');
    				$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    			}
    			catch(Exception $e)
    			{
    					die('Erreur : '.$e->getMessage());
    			}              
     
    			$reqQuestion = $bdd->query('SELECT * FROM questions LIMIT 5'); // requette pour afficher une question (teste)             
    			//$donnees = $req->fetch(); // execution de la requette et récupération des données
     
    		?>
     
    		<form action='qcmTrait.php' method='POST'>
    			<?php
    			while ($donneesQuestions = $reqQuestion->fetch()) // boucle parmetant d'affiche toutes les questions
    				{      
    			?>
    				<div class='formulaires01'> <!-- div dans la boucle while contenant les questions et les réponses (sauf le bouton validé) -->
    					<?php $idQuestion = $donneesQuestions['id'];?> <!-- récupération de l'ID des question -->
    					<p><em>Q. : </em><?php echo $donneesQuestions['question'];?> </p> <!-- Affichage de la 1ère question de cette boucle while -->
    					<input type='hidden' name='idQuestion' value='<?php echo $idQuestion;?>'> <!-- input caché qui récupère l'id de cette question pour pouvoir l'envoyer sur la page de traitement-->
     
    					<?php                              
     
    						$reqReponse = $bdd->prepare('SELECT * FROM reponses WHERE id_question =(select id from questions where id= :idQuestion)'); // requette préparer pour afficher la réponse assosié a sa question, grace a la variable $idQuestion récupérer plus haut.            
    						$reqReponse->execute(['idQuestion' => $idQuestion]); // éxécution de la requette préparer
     
    						while ($donneesReponses = $reqReponse->fetch()) // boucle permetant d'afficher toutes les reponses assosiées
    						{                          
    					?>
    						<div class='QuesCheck'> <!-- Div contenant les réponses -->
    							<input type='checkbox' id='questionQCM' name='question[<?php echo $donneesQuestions['id']; ?>][<?php echo $donneesReponses['id']; ?>]' value='1'> <!-- Checkboxe qui va se dupliqué, et s'affiché en fonction du nombre de réponse éxistante touver GRACE A LA BOUCLE WHILE -->
    							<label for='questionQCM'><?php echo $donneesReponses['Reponse'];?></label>
    						</div>
     
    					<?php
    						} // Fermeture de la boucle while parmetant d'affiche toutes les reponses assosiées
    						$reqReponse->closeCursor(); // Important : on libère le curseur pour la prochaine requête
    					?>
    				</div> <!-- Fermeture du div class formulaire01 -->
    			<?php
    				} // Fermeture de la boucle while parmetant d'affiche toutes les questions
    				$reqQuestion->closeCursor(); // on libère le curseur pour la prochaine requête, comme on est dans une boucle
    			?>
    			<hr>
    			<div> <!-- div contenant le bouton Valider (en dehors de toute les boucle mais toujours dans le formulaire) -->
    				<button class='valid' id='boutonValide' type='submit'>Valider</button> <!-- Bouton d'envoie du formulaire -->
    			</div>
     
    		</form> <!-- Fermeture du form -->
     
     
    	</div>
     
    	</center>
    </body></html>
    Comme vous pouvez le voir, dans la partie qcmTrait, j'ai mis en commentaire l'insertion sur la bdd, et j'ai mis pas mal d'echo pour tester. J'ai mis aussi d'autres boucles pour tester d'afficher les information que je veux envoyer sur le serveur.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Et donc ?
    Quelle est la question ?
    Quel est le problème ?


    N.B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $idUser = $_POST['question'];
    Quel rapport entre un "id utilisateur" et la "question" ?
    Ce n'est pas clair, et/ou les noms des variables sont mal choisis.

    ...Ma base de donnée a 3 champs : question, reponse, reponseUser....
    On dit : "la table a 3 colonnes"

    Et tu n'enregistres pas l'id de l'utilisateur ?

    Mets de l'ordre dans tes idées.
    Dernière modification par Invité ; 03/04/2019 à 17h05.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 4
    Par défaut
    bonjour,

    C'est moi qui ai posé la question. J'étais pas chez moi et je l'ai donc posé depuis le compte d'un amis.

    Le problème : Problème d'insertion des données(idQuestion, idReponse, noteUser et reponseUser) sur la bdd
    Pourquoi ? le dernier foreach n'aime pas la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_POST['question'][$donneesQuestions['id']]
    qui est un tableau a 2 dimensions.
    contient l'id des questions avec l'id des réponses choisi pas l'utilisateur et la réponse,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [$donneesQuestions['id']]
    contient d'id des questions.
    Un var_dump de $_POST['question'] nous retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    array (size=5)
      1 => 
        array (size=1)
          3 => string '1' (length=1)
      2 => 
        array (size=1)
          5 => string '1' (length=1)
      3 => 
        array (size=1)
          11 => string '1' (length=1)
      4 => 
        array (size=1)
          15 => string '1' (length=1)
      5 => 
        array (size=1)
          17 => string '1' (length=1)

    cette partie du code c'était pour tester(vous pouvez le mettre en commentaire ou même le supprimer si vous testez le code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
                // $idUser = $_POST['question'];
                // // test $_POST['question'][$donneesQuestions['id']]
                // echo "<br> la taile du tableau 'question' : ". sizeof($idUser);
                //     for ($i=0; $i <= sizeof($idUser) ; $i++) { 
                //         echo "<br>".$i." <~~~~~~<br>";    
                //         // echo $idUser[$i];
                //     }
     
     
                //     echo " <br> ";
                //     echo " <br> ---------------------------";
                //     print_r($_POST['question']); // je recupère l'id des réponses choisis par l'user
                //     echo "------------------------ <br> ";
     
                // foreach ($idUser as $key => $value) {
                //     echo " <br> ";
                //     echo $key;
                //     echo " <br> ";
                //     // echo $value;
                //     echo " <br> ";
                // }
    Voici le code de qcmTrait(simplifier) qui est la page de traitement du QCM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
    var_dump($_POST['question']);
        try
        {
            $bdd = new PDO('mysql:host=localhost;dbname=qcm;charset=utf8', '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;
    			$idReponse;
                while ($donneesReponses = $reqReponse->fetch()) // boucle permetant d'afficher toutes les reponses assosiées
                {
                    $idReponse = $donneesReponses['id'];
                    if ($donneesReponses['Validation'] ==1 && !isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                        $choix = false;
                        echo "<br>bonne réponse : $i manquante<br/>";
                        break;
                    } elseif ($donneesReponses['Validation'] ==0 && isset($_POST['question'][$donneesQuestions['id']][$donneesReponses['id']])) {
                        $choix = false;
                        echo "<br>mauvaise réponse : $i cochée";
                        break;
                    }  
                    $i++;
                }
     
                if ($choix == true) {
                    echo ('<br>bonne rep');
                    $note += 10;
                    echo "<br>". $note. " --> la note += $note";
                } else {
                    echo ('<br>mauvaise rep');
                    $note += 0;
                    echo "<br>". $note. " --> la note += $note";
                }
     
                $reqReponse->closeCursor();
                echo " <br> ";
                foreach ($_POST['question'][$donneesQuestions['id']] as $key => $value) { // dans ce premier boucle foreach je récupère l'id de la question
                    echo "<br>".$key . " --> l'id de la réponse"; // l'id de la question
                    echo " <br> ";
                    echo $value. " --> ici on a le value des réponses qui sont tous = 1 "; 
                    echo " <br> ";                    // la réponse
                        // requette ici pour insérer ligne par ligne dans la bdd
                        $reqInsertReponse = $bdd->prepare('INSERT INTO reponseUser (reponse_User= :reponseUser, note_User= :note, id_Question= :idQuestion, id_Reponse= :idReponse');
                        $reqInsertReponse->execute([
    						'reponseUser' => $value,
    						'note' => $note,
    						'idQuestion' => $idQuestion,
    						'idReponse' => $idReponse,
    					]);
                        echo "<br><br> Insertion réussi";
     
                }
                $reqInsertReponse->closeCursor();
     
            }
             echo "<br>". $note . "<br><br>";
     
     
    ?>

    Le problème que j'ai est un fatal Error de PDO :

    Nom : error_PDO.png
Affichages : 1093
Taille : 38,6 Ko

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- il suffit de savoir LIRE (ou traduire) le message d'erreur : tu as une erreur de syntaxe de la requête, ligne 64.
    Celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        $reqInsertReponse = $bdd->prepare('INSERT INTO reponseUser (reponse_User= :reponseUser, note_User= :note, id_Question= :idQuestion, id_Reponse= :idReponse');
    La bonne syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        $reqInsertReponse = $bdd->prepare('INSERT INTO reponseUser (reponse_User, note_User, id_Question, id_Reponse) VALUES (:reponse_User, :note_User, :id_Question, :id_Reponse');
    Remarque : j'ai remplacé les noms des placeholders par les MEMES que les noms des colonnes, avec un ":" devant.
    Ainsi, c'est plus simple (inutile de compliquer le code)

    2- IMPORTANT : la préparation de la requête n'a besoin de se faire QU'UNE SEULE FOIS.
    Il faut donc mettre cette ligne AVANT le foreach.

    3- Pour l’exécution (DANS le foreach), il faut ajouter les ":" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                        $reqInsertReponse->execute([
    						':reponse_User' => $value,
    						':note_User' => $note,
    						':id_Question' => $idQuestion,
    						':id_Reponse' => $idReponse,
    					]);
    Dernière modification par Invité ; 03/04/2019 à 22h07.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 4
    Par défaut
    Bonjour,

    Merci pour votre réponse. Pour la syntaxe du prepare, une personne m'avait aidé a le trouver cette après-midi, mais merci aussi
    J'avais toujours l'erreur mais garce à vous, quand vous m'avez dit de mettre la requête en dehors du foreach, ça a fonctionné, merci encore !

    Mais malgré cela, j'ai toujours une erreur. Mon foreach s'écrit comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($_POST['question'][$donneesQuestions['id']] as $key => $value) {
    Je sais pas pourquoi mais on dirait que le foreach n'aime pas ma variable, qui je rappelle est un tableau a double dimension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_POST['question'][$donneesQuestions['id']]
    Voici l'erreur :
    Nom : error_foreach.png
Affichages : 1106
Taille : 29,8 Ko
    Est-ce que la cause de l'erreur est le fait que c'est un tableau a double dimension ?



    .

  6. #6
    Invité
    Invité(e)
    Par défaut
    Que renvoient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump( $donneesQuestions['id'] );
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump( $_POST['question'] );
    et enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump( $_POST['question'][$donneesQuestions['id']] );
    ?

Discussions similaires

  1. [XL-2007] création d'une macro pour mettre à jour une BDD
    Par morguie31 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 17/11/2012, 16h10
  2. Récupération de données dans un fichier pour copie sur une feuille
    Par Maxime082 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 19/05/2011, 19h41
  3. Extraire des données pour mettre dans une BD
    Par luciedoudou dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 21/02/2008, 14h17
  4. Extraire des données pour mettre dans une BD
    Par luciedoudou dans le forum Excel
    Réponses: 7
    Dernier message: 21/02/2008, 10h19
  5. Récupération de données pour mettre dans un fichier .txt
    Par lince102 dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 24/01/2008, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo