8792 sujets

Développement web côté serveur, CMS

Bonjour,

J'avais tenté de faire un quizz et j'avais trouvé une méthode utilisant des tableaux, cela fonctionne bien.

Le soucis c'est que c'était pas trop confortable et j'ai voulu mettre ça sur une base de données.

J'arrive à afficher les questions et les réponses, en les piochant au hasard dans la table, et je les place ensuite dans un array. Le soucis c'est pour les envoyer par formulaire. J'ai essayé de passer l'array dans un champ caché, en le convertissant avec serialize, mais rien n'y fait, une fois le formulaire envoyé, et même en faisant un unserialize, la page est vide Smiley ohwell

Je vous mets le code si vous avez un indice :



<?php $page = basename($_SERVER['PHP_SELF']);

if (!isset($result)) {

$db=mysql_connect("***", "***", "***");
 mysql_select_db("****", $db);
 
 $sql='SELECT questions, reponses, reponses2, reponses3, solution1, explication FROM qcm ORDER BY RAND() LIMIT 7';
	   
 $req=mysql_query($sql) or die(mysql_error());
 

	$quizz = array ();
	 while($tab= mysql_fetch_array($req,MYSQL_NUM)) {
		$Servquestions = $tab[0];
		$Servreponses = $tab[1];
		$Servreponses2 = $tab[2];
		$Servreponses3 = $tab[3];
		$Servsolution1 = $tab[4];
		$Servexplication = $tab[5];
		array_unshift ($quizz, $tab);
//	array_push($ServArray,$ServNom);
	}



// on ferme la connexion à mysql
mysql_close();


  print "<form action=\"$page\" method='post'>\n";
  for ($i=0; $i<count($quizz); $i++) {
        $nom="_".$i;
        print '<blockquote><span class="vert">';
        print "\t".$quizz[$i][0]."\n";
        print '</span><br /><br />';
            for ($j=1; $j<count($quizz[$i])-2; $j++) {
           $quest=$quizz[$i][$j];
           print "<input type='radio' name=\"$nom\" value=\"$j\" /> $quest<br />\n ";
            }
        print "</blockquote><hr />";
  }
  print "<input type='hidden' name='quizz' value=\"array(serialize($quizz)\"  />"
  print "<input type='hidden' name='result' value='voir' /><br />\n<center>";
  print "<input type='submit' value='Vos résultats et la correction' /></center></form>\n";
}


Jusque là ca va, génération des questions ok.


else {

$quizz = array(unserialize(stripslashes($_POST['quizz'])));  

  print '<h4 align="center">Résultats du quizz</h4><br />';
  $points=0;
  for($i=0; $i<count($quizz); $i++) {
        $nom="_".$i;
        print  '<blockquote><span class="vert">';
        print "\t".$quizz[$i][0]."</span><br /><br />\n";
        $numero_bonne=$quizz[$i][count($quizz[$i])-2]; /* avant dernière valeur du tableau */
       $bonne=$quizz[$i][$numero_bonne]; /* Bonne réponse */
        if ($$nom==$numero_bonne) {
           print "Votre réponse <b><i>".$bonne."</i></b> est exacte.";
           $points++;
           }
           else {
                print "La bonne réponse est <b>".$bonne."</b> mais vous ";
                if ($$nom=="") {
                   print "n'avez rien répondu.";
                }
                else {
                   print 'avez choisi la proposition" <b>'.$quizz[$i][$$nom].' "</b>.';
                }
           }
        $commentaire=$quizz[$i][count($quizz[$i])-1]; /* dernière valeur du tableau */
       print "<br />".$commentaire."<br />\n";       
       print "</blockquote><hr />\n";
        $nom++;
  }
  if($points==count($quizz)) {
        print"<br /><h4 align='center'>Félicitations vous avez tout juste&nbsp;!</h4>\n";
        }
        else {
          print "<br /><h4 align='center'>Vous avez $points bonne";
          if ($points>1) print "s";
          print " réponse";
          if ($points>1) print "s";
          print " sur ".count($quizz)." questions.</h4>\n";
        }
}
?>


Et la plus rien ^^

A moins d'utiliser une session pour retenir l'array ?
Mais sans session ça m'irais mieux Smiley cligne

Merci
Modifié par spike2 (06 Jun 2007 - 20:42)
Salut Smiley cligne ,

Comme je n'ai pas la structure complète et le type de données je ne peux pas aller plus loin mais déjà :

En remplaçant
if (!isset($result)) {
par
if (!isset($_POST['result'])) {

Puis
print "<input type='hidden' name='quizz' value=\"array(serialize($quizz)\"  />"
par
print "<input type='hidden' name='quizz' value='".serialize($quizz)."'  />";

ça devrait aller mieux Smiley langue


*Edit: Je viens de rejeter un oeil et en remplaçant
if ($$nom==$numero_bonne) {
par
if ($_POST[$nom]==$numero_bonne) {

Puis
if ($$nom=="") {
par
if ($_POST[$nom]=="") {

Puis
print 'avez choisi la proposition" <b>'.$quizz[$i][$$nom].' "</b>.';
par
print 'avez choisi la proposition" <b>'.$quizz[$i][$_POST[$nom]].' "</b>.';

ça a l'air de fonctionner Smiley smile
Modifié par Heyoan (06 Jun 2007 - 19:07)
Mhhh ^^

Je dirai pas que ça fonctionne moi ^^

Le soucis est pour l'array. Il arrive bien à passer par le formulaire, j'ai fais un :

$quizz2 = $_POST['quizz'];
echo $quizz2 ;


Et j'obtiens bien le texte à transférer.

Seulement apres quand il faut passer par unserialize, l'array est vide.

$quizz = array(unserialize(stripslashes($_POST['quizz'])));
print_r($quizz);


Si tu veux tester toi même le quizz tu peux tester la page Smiley cligne valide direct en bas, les questions ne sont pas de ton niveau je pense Smiley lol
exemple
Re'

J'ai créé cette table pour mon test :
CREATE TABLE `qcm` (
  `questions` varchar(50) NOT NULL default '',
  `reponses` varchar(25) NOT NULL default '',
  `reponses2` varchar(25) NOT NULL default '',
  `reponses3` varchar(25) NOT NULL default '',
  `solution1` varchar(25) NOT NULL default '',
  `explication` varchar(25) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `qcm` VALUES ('Quelle est la capitale de la France ?', 'Paris', 'Londres', 'Moscou', '1', 'Ben oui....');
INSERT INTO `qcm` VALUES ('Combien font 2 + 2 ?', '1', '3', '4', '3', 'Ben 4');
INSERT INTO `qcm` VALUES ('Quel est ton pseudo ?', 'Gillou', 'Heyoan', 'Antoine', '2', 'No comment...');


et le code php :
<?php $page = basename($_SERVER['PHP_SELF']);
if (!isset($_POST['result'])) {
$db=mysql_connect("localhost", "root", "");
 mysql_select_db("test", $db);
 $sql='SELECT questions, reponses, reponses2, reponses3, solution1, explication FROM qcm ORDER BY RAND() LIMIT 7';
 $req=mysql_query($sql) or die(mysql_error());
	$quizz = array ();
	 while($tab= mysql_fetch_array($req,MYSQL_NUM)) {
		array_unshift ($quizz, $tab);
	}

// on ferme la connexion à mysql
mysql_close();

  print "<form action=\"$page\" method='post'>\n";
  for ($i=0; $i<count($quizz); $i++) {
        $nom="_".$i;
        print '<blockquote><span class="vert">';
        print "\t".$quizz[$i][0]."\n";
        print '</span><br /><br />';
            for ($j=1; $j<count($quizz[$i])-2; $j++) {
           $quest=$quizz[$i][$j];
           print "<input type='radio' name=\"$nom\" value=\"$j\" /> $quest<br />\n ";
            }
        print "</blockquote><hr />";
  }
  print "<input type='hidden' name='quizz' value='".serialize($quizz)."'  />";
  print "<input type='hidden' name='result' value='voir' /><br />\n<center>";
  print "<input type='submit' value='Vos résultats et la correction' /></center></form>\n";
}
else {
$quizz = unserialize($_POST['quizz']);  
  print '<h4 align="center">Résultats du quizz</h4><br />';
  $points=0;
  for($i=0; $i<count($quizz); $i++) {
        $nom="_".$i;
        print  '<blockquote><span class="vert">';
        print "\t".$quizz[$i][0]."</span><br /><br />\n";
        $numero_bonne=$quizz[$i][count($quizz[$i])-2]; /* avant dernière valeur du tableau */
       $bonne=$quizz[$i][$numero_bonne]; /* Bonne réponse */
        if ($_POST[$nom]==$numero_bonne) {
           print "Votre réponse <b><i>".$bonne."</i></b> est exacte.";
           $points++;
           }
           else {
                print "La bonne réponse est <b>".$bonne."</b> mais vous ";
                if ($_POST[$nom]=="") {
                   print "n'avez rien répondu.";
                }
                else {
                   print 'avez choisi la proposition " <b>'.$quizz[$i][$_POST[$nom]].' "</b>.';
                }
           }
        $commentaire=$quizz[$i][count($quizz[$i])-1]; /* dernière valeur du tableau */
       print "<br />".$commentaire."<br />\n";       
       print "</blockquote><hr />\n";
        $nom++;
  }
  if($points==count($quizz)) {
        print"<br /><h4 align='center'>Félicitations vous avez tout juste !</h4>\n";
        }
        else {
          print "<br /><h4 align='center'>Vous avez $points bonne";
          if ($points>1) print "s";
          print " réponse";
          if ($points>1) print "s";
          print " sur ".count($quizz)." questions.</h4>\n";
        }
}
?>


Et à part la gestion des apostrophes que je n'ai pas géré, ça fonctionne Smiley langue ...
Ou pour faire une spéciale dédicace à Julien : chez moi ça marche Smiley lol

Et pour les questions de l'exemple : j'ai rien compris Smiley biggol

*Edit: le fait qu'aucune réponse n'ait été sélectionnée n'est pas géré non plus...
Modifié par Heyoan (06 Jun 2007 - 20:46)
Bon j'ai finalement trouvé le petit oublie ^^ C'est à dire urlencode et urldecode

value='".urlencode(serialize($quizz))."'


et

$quizz2 = urldecode(stripslashes($_POST['quizz'])) ;
$quizz3 = unserialize($quizz2);
$quizz = $quizz3 ;


Oui j'ai fais trois étapes à la fin, mais j'en avais marre Smiley cligne

Merci pour ton aide Heyoan Smiley biggrin
J'ai refais la même table que toi et le reste mais ça ne marche pas chez moi Smiley cligne

Voilà, c'est tout Smiley cligne


ps : Et oui les questions ça rigole pas, avis aux amateurs Smiley lol
a écrit :
*Edit: le fait qu'aucune réponse n'ait été sélectionnée n'est pas géré non plus...


Sur ton exemple, ou le mien ?

Parce que si on répond pas, à la correction il te marque que tu n'as rien répondu.
spike2 a écrit :
J'ai refais la même table que toi et le reste mais ça ne marche pas chez moi Smiley cligne
D'où le gag du "chez moi ça marche" Smiley cligne

spike2 a écrit :
Sur ton exemple, ou le mien ?
Sur le mien Smiley langue


*Edit: donc le code que tu as donné au début n'était pas complet Smiley smile
Modifié par Heyoan (06 Jun 2007 - 21:07)
Si si ^^ le seul truc que j'ai modifié c'est ce que tu m'as dis

D'ailleurs il y est le code dans mon premier post:

print "La bonne réponse est <b>".$bonne."</b> mais vous ";

                if ($$nom=="") {

                   print "n'avez rien répondu.";

                }

                else {...
C'est juste que tu ne testes pas l'existence de $_POST[$nom] avant de l'utiliser alors que chez moi j'ai un message (variable register_global à off)...