Bonsoir,
Ayant eu hier de forts intéressants échanges avec Celira et jreaux62, je souhaiterais, si c'est possible améliorer un des 2 QCM fonctionnels qui ont résulté des propositions.
Mon objectif est de reprendre avec comme base une des 2 propositions auxquelles les échanges d'hier avec Celira et jreaux62 ont abouti mais en complétant avec les points suivants:
- Ajouter en face de chaque question une image dépendant de la question, du type 'quel est le personnage ci-contre ? Einstein, Volt ou molière ?'
Afficher les enregistrements dans un ordre aléatoire, les 5 premiers, le corrigé de ces 5 puis les 5 suivants, etc, tout en mettant à jour les résultats.
Mes idées:
- Pour ce faire, j'ai ajouté à la table 'questions' un 4ème champ intitulé 'adresse_image' de type varchar(60) qui contient ..... l'adresse de chaque image.
- Je pense qu'un tableau serait utile pour respecter ma mise en forme et ainsi mettre les images à gauche et les choix à droite.
Les 2 tables en présence sont donc les suivantes:
La proposition 1 consiste dans les 2 scripts suivants :
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 -- phpMyAdmin SQL Dump -- version 4.4.13.1 -- http://www.phpmyadmin.net -- -- Structure de la table `questions` -- CREATE TABLE IF NOT EXISTS `questions` ( `id_question` int(11) NOT NULL, `texte_question` text NOT NULL, `choix_question` varchar(10) NOT NULL, `adresse_image` varchar(60) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; -- -- Contenu de la table `questions` -- INSERT INTO `questions` (`id_question`, `texte_question`, `choix_question`, `adresse_image`) VALUES (1, '1. Comment se nomme ce scientifique ?', '1,2,3;2', '../images/leonard.jpg'), (2, '2. Qui est cette personne?', '4,5,6;5', '../images/johnny-H.jpg'), (3, '3. Qui est ce sportif ?', '7,8,9;9', '../images/PapiM.jpg'); -- -- Index pour les tables exportées -- -- -- Index pour la table `questions` -- ALTER TABLE `questions` ADD PRIMARY KEY (`id_question`); -- -- AUTO_INCREMENT pour les tables exportées -- -- -- AUTO_INCREMENT pour la table `questions` -- ALTER TABLE `questions` MODIFY `id_question` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -- -------------------------------------------------------- -- -- Structure de la table `reponses` -- CREATE TABLE IF NOT EXISTS `reponses` ( `id_reponse` int(11) NOT NULL, `texte_reponse` text NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1; -- -- Contenu de la table `reponses` -- INSERT INTO `reponses` (`id_reponse`, `texte_reponse`) VALUES (1, 'Ampere'), (2, 'De Vinci'), (3, 'Volt'), (4, 'Isaac Hayes'), (5, 'Johnny Haliday'), (6, 'Mireille Mathieu'), (7, 'Carl Lewis'), (8, 'Ben Johnson'), (9, 'Papi Mougeot'); -- -- Index pour les tables exportées -- -- -- Index pour la table `reponses` -- ALTER TABLE `reponses` ADD PRIMARY KEY (`id_reponse`); -- -- AUTO_INCREMENT pour les tables exportées -- -- -- AUTO_INCREMENT pour la table `reponses` -- ALTER TABLE `reponses` MODIFY `id_reponse` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=10; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
index.php:
et questions.php:
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 <?php // Inspiré de http://www.developpez.net/forums/d1056266/php/scripts/modification-d-sript-quizz/ session_start(); include "../php/mysqli_conf.inc.php"; // Inclusion du fichier de connexion à la base de données $link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link)); // Connexion à MySql /* Vérification de la connexion */ if (mysqli_connect_errno()) { printf("échec de la connexion : %s\n", mysqli_connect_error()); exit(); } function pre($tab) { echo '<pre>'; print_r($tab); echo '</pre>'; } if(filter_has_var(INPUT_POST, 'goForm')) { // si le bouton formulaire est cliqué (donc formulaire validé). - pareil que isset() $output = '';//texte à afficher à la fin des tests. for($i = 1; $i <= $_SESSION['nombre_question']-1; $i++) { if(filter_has_var(INPUT_POST, 'reponse_question'.$i)) //si la personne a répondu { $query = "SELECT * FROM QCM_DefautsDesBois_questions WHERE id_question = $i"; if ($result = mysqli_query($link, $query)) { $question = mysqli_fetch_assoc($result); /* Récupère une ligne de résultat sous forme de tableau associatif */ mysqli_free_result($result); } list($not_used, $reponse_juste) = explode(';', $question['choix_question']); $output .= 'A la question "'.$question['texte_question'].'" vous avez répondu '; if($_POST['reponse_question'.$i] != $reponse_juste) { $query = "SELECT texte_reponse FROM QCM_DefautsDesBois_reponses WHERE id_reponse = $reponse_juste"; if ($result = mysqli_query($link, $query)) { $reponse = mysqli_fetch_assoc($result); /* Récupère une ligne de résultat sous forme de tableau associatif */ mysqli_free_result($result); } $output .= 'faux. La réponse était: '.$reponse['texte_reponse']; } else { $output .= 'juste. Bravo!'; } $output .= '<br /><br />'; } else { $output .= 'Vous n\'avez pas répondu à la question "'.$question['texte_question'].'"<br />'; } } } else { //si formulaire pas envoyé, on récupère les questions pour les afficher. } require_once 'questions.php'; ?> <!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php if(isset($output)){echo'<p style="text-align:center;">'.$output.'<br /><br /><a href="./index.php" title="Retour">Retour</a></p>';}else{ ?> <form action="./index.php" method="post"> <?php $i = 1;//on initialise à 1. Ce compteur va permettre d'assigner un numéro à chaque question pour les différencier. foreach($questions as $question){//pour chaque question dans le tableau "$questions" echo '<fieldset>';//pour faire beau echo '<legend>'.$question['texte_question'].'</legend>';//Le texte de la question. echo '<p style="padding-left:30px;">',"\r\n"; foreach($question['choix_reponse'] as $unchoix){ echo '<input type="radio" name="reponse_question'.$i.'" value="'.$unchoix['id_reponse'].'" required="required" /> '.$unchoix['texte_reponse'].'<br />',"\r\n"; } echo '</p>'; echo '</fieldset>'; $i++; //on incrémente car on va passer à la question suivante. } $_SESSION['nombre_question'] = $i; //connaitre le nombre de question dans le formulaire après la validation. ?> <br /><input type="submit" value="Valider" name="goForm" /> </form> <?php } ?> </body> </html>
La proposition 2 consiste aussi en 2 scripts:
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 <?php $questions = array(); $query = "SELECT * FROM QCM_DefautsDesBois_questions ORDER BY id_question"; if ($result = mysqli_query($link, $query)) { while($question = mysqli_fetch_assoc($result)) { list($liste_choix, $question['reponse_juste']) = explode(';', $question['choix_question']);//on sépare les choix de la réponse juste $choix = explode(',', $liste_choix); //on met dans un tableaux les différents choix unset($question['choix_question']); $question['choix_reponse'] = array(); //on va mettre dedans nos réponses qui seront chacune un tableau. foreach($choix as $unChoix) { $query = "SELECT * FROM QCM_DefautsDesBois_reponses WHERE id_reponse = $unChoix"; //on récupère le choix de réponse if ($requete_reponses = mysqli_query($link, $query)) { // récupération du résultat de la requête $reponse = mysqli_fetch_assoc($requete_reponses); array_push($question['choix_reponse'], $reponse);//on met le choix de réponse dans le tableau de choix des réponses mysqli_free_result($requete_reponses); } } array_push($questions, $question); //on met la réponse dans le tableau de réponses. //cette page génère donc la variable "questions" que nous utiliserons pour afficher le questionnaire. } mysqli_free_result($result); } ?>
quizz-questions.php:
et quizz-resultat.php:
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 <?php session_start(); header('Content-type:text/html; charset=UTF-8'); // encodage UTF-8 error_reporting(E_ALL); // en TEST // ----------------------------------------------- ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Questionnaire du Quizz</title> <style type="text/css"> form#quizz-form ul { list-style-type:none; } </style> </head> <body> <?php // ----------------------------------------------- if(empty($_SESSION['quizz'])) { // --------------------------------- // CONNEXION à la BdD include "../php/mysqli_conf.inc.php"; // Inclusion du fichier de connexion à la base de données $link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link)); // Connexion à MySql mysqli_set_charset ( $link , 'UTF8' ); // ON IMPOSE UTF-8 // --------------------------------- // Création du questionnaire $questions = array(); $query_questions = "SELECT * FROM questions ORDER BY id_question"; if ($result = mysqli_query($link, $query_questions)) { while($question = mysqli_fetch_assoc($result)) { list($liste_choix, $question['reponse_juste']) = explode(';', $question['choix_question']);//on sépare les choix de la réponse juste $question['choix_reponse'] = array(); // reponses $query_reponses = "SELECT * FROM reponses WHERE id_reponse IN (".$liste_choix.")"; //on récupère le choix de réponse if ($requete_reponses = mysqli_query($link, $query_reponses)) { while($row_reponse = mysqli_fetch_assoc($requete_reponses)) { $question['choix_reponse'][$row_reponse['id_reponse']] = $row_reponse['texte_reponse'];//on met le choix de réponse dans le tableau de choix des réponses } array_push($questions, $question);//on met la réponse dans le tableau de réponses. } } } // --------------------------------- // On met le questionnaire en SESSION $_SESSION['quizz'] = $questions; } else { // On récupère le questionnaire $questions = $_SESSION['quizz']; } ?> <h4>QCM</h4> <form id="quizz-form" method="post" action="quizz-resultat.php"> <?php // ----------------------------------------------- // AFFICHAGE du quizz : question + choix des réponses foreach($questions as $idque => $question) { echo ' <fieldset>'."\n"; echo ' <legend>'.$question['texte_question'].'</legend>'."\n"; if(!empty($question['choix_reponse'])) { echo ' <ul>'."\n"; foreach($question['choix_reponse'] as $idrep => $reponse) { echo ' <li><input type="radio" name="resultats['.$question['id_question'].']" id="reponse'.$idrep.'" value="'.$idrep.'" required="required"/><label for="reponse'.$idrep.'">'.htmlspecialchars($reponse,ENT_QUOTES,'utf-8').'</label></li>'."\n"; } echo ' </ul>'."\n"; } echo ' </fieldset>'."\n"; } ?> <p><input type="submit" name="submitQCM" value="Validez vos réponses"/></p> </form> </body> </html>
Mon interrogation:
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 <?php session_start(); header('Content-type:text/html; charset=UTF-8'); // encodage UTF-8 error_reporting(E_ALL); // en TEST !! // ----------------------------------------------- // Astuce : Enregistrer le questionnaire dans $_SESSION['quizz'] évite de faire appel à nouveau à la base de données // le script de connexion est inutile ici ! ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Résultats du Quizz</title> <style type="text/css"> </style> </head> <body> <?php // ----------------------------------------------- // Traitement du formulaire if(!empty($_SESSION['quizz']) && isset($_POST['submitQCM'])) { // --------------------------- // On récupère le questionnaire $questions = $_SESSION['quizz']; // --------------------------- echo ' <h4>Résultats du Quizz</h4>'."\n"; $resultats = $_POST['resultats']; // array contenant le réponses du candidat // var_dump($resultats); // --------------------------- // Question et réponses $BonneRepCompteur = 0; foreach($questions as $idque => $question) { echo ' <fieldset>'."\n"; echo ' <legend>'.$question['texte_question'].'</legend>'."\n"; echo ' <p><em>La bonne réponse est : </em><b>'.$question['choix_reponse'][$question['reponse_juste']].'</b><br />'."\n"; echo ' <em>Vous avez répondu : '.$question['choix_reponse'][$resultats[$question['id_question']]].'</em></p>'."\n"; if( $question['reponse_juste'] == $resultats[$question['id_question']]){ echo ' <p style="color:green;"><b>Bravo !</b> Bonne réponse !</p>'."\n"; $BonneRepCompteur++; } else { echo ' <p style="color:red;">Faux ! Mauvaise réponse...</p>'."\n"; } echo ' </fieldset>'."\n"; } // --------------------------- // Affichage du Décompte / pourcentage de bonnes réponses $QuestionsNombre = count($questions); $BonneRepNombre = $BonneRepCompteur; $BonneRepNombre .= ($BonneRepCompteur>1)? ' bonnes réponses' : ' bonne réponse'; $BonneRepPourcent = round($BonneRepCompteur/$QuestionsNombre*100); echo ' <h4>Vous avez obtenu <span style="color:green;font-size:120%;"><b>'.$BonneRepNombre.' sur '.$QuestionsNombre.'</b></span>, soit <span style="color:green;font-size:120%;"><b>'.$BonneRepPourcent.'%</b></span></h4>'."\n"; if($BonneRepPourcent >= 75){ echo ' <p style="color:green;font-size:140%;"><b>Excellent !</b></p>'."\n"; } elseif($BonneRepPourcent >= 50 && $BonneRepPourcent < 75){ echo ' <p style="color:blue;font-size:140%;">C\'est Bien !</p>'."\n"; } elseif($BonneRepPourcent >= 25 && $BonneRepPourcent < 50){ echo ' <p style="color:orange;font-size:140%;">Courage ! Peut mieux faire...</p>'."\n"; } else { echo ' <p style="color:red;font-size:140%;">Oups ! Pas terrible...</p>'."\n"; } // ---------------------------------- // Commencer/Recommencer le test ? echo ' <h4>Recommencer le test ?</h4>'."\n"; } else { echo ' <h4>Commencer le test</h4>'."\n"; } ?> <form method="post" action="quizz-questions.php"> <p><input type="submit" name="submitQCM" value="Afficher le QCM"/></p> </form> </body> </html>
Les 2 propositions en présence sont-elles compatibles pour démarrer ou faut-il que j'en écarte une ? Merci de me donner votre avis avec le pour et le contre.
Partager