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:
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 */;
La proposition 1 consiste dans les 2 scripts suivants :
index.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 &agrave; la base de donn&eacute;es
	$link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link));	// Connexion &agrave; 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>
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
<?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);
		}
?>
La proposition 2 consiste aussi en 2 scripts:
quizz-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
<?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 &agrave; la base de donn&eacute;es
	$link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link));	// Connexion &agrave; 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>
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
<?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>
Mon interrogation:
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.