Bonjour,
Ayant trouvé le script d'un QCM à l'adresse http://www.developpez.net/forums/d10...d-sript-quizz/, j'essaie de l'adapter avec Mysqli_
2 tables sont nécessaires et peuvent être construites avec le script ci-dessous:
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 -- phpMyAdmin SQL Dump -- version 3.3.9 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Ven 25 Mars 2011 à 13:58 -- Version du serveur: 5.5.8 -- Version de PHP: 5.3.4 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Base de données: `quizz` -- -- -------------------------------------------------------- -- -- Structure de la table `questions` -- CREATE TABLE IF NOT EXISTS `questions` ( `id_question` int(11) NOT NULL AUTO_INCREMENT, `texte_question` text NOT NULL, `choix_question` varchar(10) NOT NULL, PRIMARY KEY (`id_question`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `questions` -- INSERT INTO `questions` (`id_question`, `texte_question`, `choix_question`) VALUES (1, 'Quel est le meilleur forum traitant de la programmation?', '1,2,3;2'), (2, 'Que Signifie AFUP?', '4,5,6;4'); -- -------------------------------------------------------- -- -- Structure de la table `reponses` -- CREATE TABLE IF NOT EXISTS `reponses` ( `id_reponse` int(11) NOT NULL AUTO_INCREMENT, `texte_reponse` text NOT NULL, PRIMARY KEY (`id_reponse`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; -- -- Contenu de la table `reponses` -- INSERT INTO `reponses` (`id_reponse`, `texte_reponse`) VALUES (1, 'lesite.com'), (2, 'developpez.com'), (3, 'lautresite.com'), (4, 'Association Française des Utilisateurs de PHP'), (5, 'Ahem, je sais pas.'), (6, 'Aide fonction utilisateur prolongé');
2 fichiers sont nécessaires, questions.php et index.php
Je n'ai pour l'instant pas modifié questions.php qui est le suivant:
Le script index.php d'origine est le suivant:
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 <?php $questions = array(); $query = mysql_query('SELECT * FROM questions ORDER BY id_question'); while($question = mysql_fetch_assoc($query)){ 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érent choix unset($question['choix_question']);//on supprime la variable car l'a exploté, plus besoin. $question['choix_reponse'] = array();//on va mettre dedans nos réponses qui seront chacune un tableau. foreach($choix as $unChoix){//pour chaque choix $requete_reponses = mysql_query('SELECT * FROM reponses WHERE id_reponse = '.$unChoix);//on récupère le choix de réponse $reponse = mysql_fetch_assoc($requete_reponses);// on met dans un tableau array_push($question['choix_reponse'], $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. } //cette page génère donc la variable "questions" que nous utiliserons pour afficher le questionnaire. ?>
J'ai adapté index.php ainsi :
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 <?php session_start();//va nous permettre de connaître le nombre de question dans le formulaire. mysql_connect('localhost','root',''); mysql_select_db('quizz'); 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 ques isset() $output = '';//texte à afficher à la fin des testes. for($i = 1; $i <= $_SESSION['nombre_question']-1; $i++){//on fait une boucle qui va jusqu'au nombre de question if(filter_has_var(INPUT_POST, 'reponse_question'.$i)){//si la personne a répondu $query = mysql_query('SELECT * FROM questions WHERE id_question = '.$i) or die (mysql_error()); $question = mysql_fetch_assoc($query); 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 = mysql_query('SELECT texte_reponse FROM reponses WHERE id_reponse = '.$reponse_juste) or die (mysql_error()); $reponse = mysql_fetch_assoc($query); $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 />'; } }//fin for }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="ISO-8859-1"> <title>Quizz artsandsport!</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 que 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'].'" /> '.$unchoix['texte_reponse'].'<br />',"\r\n"; } echo '</p>'; echo '</fieldset>'; $i++;//on incrémente un à $i 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>
Le problème est que les questions ne s'affichent pas.
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 <?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++) {//on fait une boucle qui va jusqu'au nombre de question if(filter_has_var(INPUT_POST, 'reponse_question'.$i)) //si la personne a répondu { $query = "SELECT * FROM questions WHERE id_question = $i"; if ($result = mysqli_query($link, $query)) { $question = mysqli_fetch_fields($result); /* Récupère les informations d'un champ pour toutes les colonnes */ 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 = mysql_query('SELECT texte_reponse FROM reponses WHERE id_reponse = '.$reponse_juste) or die (mysql_error()); $reponse = mysql_fetch_assoc($query); $query = "SELECT texte_reponse FROM reponses WHERE id_reponse = '.$reponse_juste)"; if ($result = mysqli_query($link, $query)) { $reponse = mysqli_fetch_fields($result); /* Récupère les informations d'un champ pour toutes les colonnes */ 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="ISO-8859-1"> <title></title> </head> <body> <?php if(isset($output)){echo'<p style="text-align:center;">'.$output.'<br /><br /><a href="./adetruire5.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'].'" /> '.$unchoix['texte_reponse'].'<br />',"\r\n"; } echo '</p>'; echo '</fieldset>'; $i++;//on incrémente un à $i 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>
J'ai 2 pistes pour mon bug :
- mon utilisation de la variable est peut-être mauvaise en ligne 30
- la fonction qui remplace Mysql_fetch_assoc n'est peut-être pas Mysqli_fetch_fields
Je vous remercie d'avance pour vos propositions.
Partager