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:
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.
?>
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
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>
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
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 &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++)
		{//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>
Le problème est que les questions ne s'affichent pas.
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.