Probléme questionnaire

Eléphanteau du PHP | 11 Messages

06 déc. 2013, 00:44

Bonjour,
je suis actuellement sur un projet scolaire, (oui je suis débutant...) qui a pour but de créer un site éducatif ..

j'en suis à la mise en place de questions et réponses, la base de données est déja créée mais le soucis que j'ai c'est que mes questions doivent s'afficher si la réponse à celle en cour est bonne. Sauf que mon probléme c'est qu'elle s'affiche toute en méme temps.

je vous donne le liens de ma pagehttp://www.island-learning.fr/affichage ... nnaire.php

et voici mon code source,

Je vous remercie par avance de votre aide.
$req = $bdd->query('SELECT * FROM questions');
	
	
	
	while($donnees = $req->fetch())
	{?>
		<span class="margin">Questions : </span><h2><?php echo $donnees['question']; ?></h2>
		<form action="affichage_questionnaire.php" method="post">
			<input type="text" name="reponse" />
			<input type="submit" value="Valider" />
		</form>
		<?php
	
			if ($_POST['reponse'] == $donnees['reponse'])
			{    
			
				$donnees['id'+1];
				?>
			     
				 <h4> Bonne Réponse :) !! </h4></br>
				 <h5> + 1 pt :) !</h5>
				 
				
				 <?php
				

			}
	}
		
	
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 déc. 2013, 11:02

salut,

ton code affiche toujours tous les question quoi qu'il arrive.

peux tu être plus précis (par exemple un algo pseudo code) pour mieux comprendre ce que tu veux.

il y a des chances que ta solution soit coté client plus que coté serveur (bien le premier implique forcément du code serveur).

Si par exemple tu veux une pagination (une seule question à la fois) il faut que tu le gère dans la requête et que tu passe l'information pour savoir où tu en est.

bref il y a forcément une réponse plus précise à ta question mais il faudrait que cela soit un poil plus clair ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

06 déc. 2013, 11:28

Donc je m'explique, j'aimerais que mes questions s'affiche l'une aprés l'autre et non pas l'une en dessou de l'autre.

mais lorsque la question est fausse j'aimerais que le client ai une deuxieme chance et si la deuxieme chance elle aussi est fausse alors on affiche le resultat mais on lui accorde pas de point. Donc du coup sa serait un truc du genre.

Si reponse = bonnereponse ET reponse=deuxiemechance alors
passer à la question suivante.
on ajouter un point

Sinon si reponse = mauvaisereponse alors
Afficher à nouveau la question.

salut,

ton code affiche toujours tous les question quoi qu'il arrive.

peux tu être plus précis (par exemple un algo pseudo code) pour mieux comprendre ce que tu veux.

il y a des chances que ta solution soit coté client plus que coté serveur (bien le premier implique forcément du code serveur).

Si par exemple tu veux une pagination (une seule question à la fois) il faut que tu le gère dans la requête et que tu passe l'information pour savoir où tu en est.

bref il y a forcément une réponse plus précise à ta question mais il faudrait que cela soit un poil plus clair ;)


@+

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 déc. 2013, 13:08

donc il te faut :
[*] gérer coté serveur la progression
[*][*] une variable de session contenant un tableau avec l'id de la question en index et le nb d'essai
[*][*] ou une variable de session contenant un tableau qui contient l'id de la question courante et le nombre d'essai.

[*] la condition de la requête sql doit être fait en fonction de l'id de la question qui est en session
[*] la gestion de la réponse et de la question à afficher doit se faire avant la requête SQL
[*] Tu doit ajouter un bouton "suivant" sur ta page lorsque celui est cliqué il faut que tu modifie la requête SQL pour prendre l'id suivant dans la table.
[*] à l'affichage tu stocke en session l'id de la question courante + incrément du nombre d'affichage (qui est mis a zéro lorsque tu sais que tu change de question).
[*] l'attribut de boit se fait lorsque valide la question.

voila une base.
c'est pas forcément clair, mais essai de faire chaque morceau un a un.
commence par trouver les requêtes qui vont bien.
puis la mécanique pour la gestion de la question.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

07 déc. 2013, 13:31

je comprend pas ce que tu veux dire par variable de session contenant un tableau ..

Merci
donc il te faut :
[*] gérer coté serveur la progression
[*][*] une variable de session contenant un tableau avec l'id de la question en index et le nb d'essai
[*][*] ou une variable de session contenant un tableau qui contient l'id de la question courante et le nombre d'essai.

[*] la condition de la requête sql doit être fait en fonction de l'id de la question qui est en session
[*] la gestion de la réponse et de la question à afficher doit se faire avant la requête SQL
[*] Tu doit ajouter un bouton "suivant" sur ta page lorsque celui est cliqué il faut que tu modifie la requête SQL pour prendre l'id suivant dans la table.
[*] à l'affichage tu stocke en session l'id de la question courante + incrément du nombre d'affichage (qui est mis a zéro lorsque tu sais que tu change de question).
[*] l'attribut de boit se fait lorsque valide la question.

voila une base.
c'est pas forcément clair, mais essai de faire chaque morceau un a un.
commence par trouver les requêtes qui vont bien.
puis la mécanique pour la gestion de la question.


@+

Eléphanteau du PHP | 46 Messages

08 déc. 2013, 09:18

Bonjour,
étant donné que tu es débutant si tu veux faire plus simple, tu n'es pas obligé d'utiliser les variables de session.
Tu trouveras ci dessous un exemple.

notes:
- j'ai remplacé l'accès à la base de données par un tableau question / réponse. Dans les 2 cas çà ne change rien à la logique, tu as toujours un tableau sauf que là il est "en dur" au lieu d'etre rempli par un fetch
- j'ai mis un petit bout de code javascript pour éviter que un essai soit compté si l'utilisateur clique sans rien écrire

à +

Code : Tout sélectionner

<html> <head> <title>Questionnaire</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script type="text/javascript"> function check() { //verification reponse non vide if (document.formulaire.reponse.value == "") { alert("Veuillez saisir votre reponse !"); return(false); } return(true); } </script> </head> <body> <?php $questions = array("Texte de la question numero 1","Texte de la question numero 2","Texte de la question numero 3","Texte de la question numero 4"); $reponses = array("Reponse numero 1","Reponse numero 2","Reponse numero 3","Reponse numero 4"); $nb_question = count($questions); if(empty($_POST['num_question'])) { $num_question = 1; $num_essai = 1; $nombre_points = 0; $msg = "" ; } else { $num_question = $_POST['num_question'] ; $num_essai = $_POST['num_essai'] ; $reponse = $_POST['reponse'] ; $nombre_points = $_POST['nombre_points'] ; $num_essai++ ; if($reponse == $reponses[$num_question-1]) { $msg = 'Bonne réponse, vous gagnez un point !<br /><br />' ; $nombre_points ++; //on passe à la question suivante $num_question++ ; $num_essai = 1; } else { if($num_essai <= 2) { $msg = 'Réponse fausse.<br /><br />' ; } else { $msg = 'Vous avez échoué à la question '.$num_question.' <br />' ; $msg .= 'La bonne réponse était: '.$reponses[$num_question-1].'<br /><br />' ; //on passe à la question suivante $num_question++ ; $num_essai = 1; } } } ?> <?php if($num_question <= $nb_question): ?> <form method="POST" action="affichage_questionnaire.php" name="formulaire" onSubmit="return check();" > <p> <input type="hidden" name="num_question" value="<?php echo $num_question ?>" /> <input type="hidden" name="num_essai" value="<?php echo $num_essai ?>" /> <input type="hidden" name="nombre_points" value="<?php echo $nombre_points ?>" /> <?php echo $msg ; ?><br /> <?php echo $questions[$num_question-1] ; ?><br /><br /> Votre réponse (essai numéro <?php echo $num_essai ?>): <input type="text" name="reponse" /> <input type="submit" value="Valider" /> <br /><br /> Votre score: <?php echo $nombre_points ; ?> </p> </form> <?php else: ?> <p> <?php echo $msg ; ?> Fin du questionnaire.<br /> Votre score: <?php echo $nombre_points ; ?> </p> <?php endif; ?> </body> </html>

Eléphanteau du PHP | 11 Messages

08 déc. 2013, 15:03

Merci :)

Donc comment j'intégre mes questions et réponses de ma base de données ?
Bonjour,
étant donné que tu es débutant si tu veux faire plus simple, tu n'es pas obligé d'utiliser les variables de session.
Tu trouveras ci dessous un exemple.

notes:
- j'ai remplacé l'accès à la base de données par un tableau question / réponse. Dans les 2 cas çà ne change rien à la logique, tu as toujours un tableau sauf que là il est "en dur" au lieu d'etre rempli par un fetch
- j'ai mis un petit bout de code javascript pour éviter que un essai soit compté si l'utilisateur clique sans rien écrire

à +

Code : Tout sélectionner

<html> <head> <title>Questionnaire</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script type="text/javascript"> function check() { //verification reponse non vide if (document.formulaire.reponse.value == "") { alert("Veuillez saisir votre reponse !"); return(false); } return(true); } </script> </head> <body> <?php $questions = array("Texte de la question numero 1","Texte de la question numero 2","Texte de la question numero 3","Texte de la question numero 4"); $reponses = array("Reponse numero 1","Reponse numero 2","Reponse numero 3","Reponse numero 4"); $nb_question = count($questions); if(empty($_POST['num_question'])) { $num_question = 1; $num_essai = 1; $nombre_points = 0; $msg = "" ; } else { $num_question = $_POST['num_question'] ; $num_essai = $_POST['num_essai'] ; $reponse = $_POST['reponse'] ; $nombre_points = $_POST['nombre_points'] ; $num_essai++ ; if($reponse == $reponses[$num_question-1]) { $msg = 'Bonne réponse, vous gagnez un point !<br /><br />' ; $nombre_points ++; //on passe à la question suivante $num_question++ ; $num_essai = 1; } else { if($num_essai <= 2) { $msg = 'Réponse fausse.<br /><br />' ; } else { $msg = 'Vous avez échoué à la question '.$num_question.' <br />' ; $msg .= 'La bonne réponse était: '.$reponses[$num_question-1].'<br /><br />' ; //on passe à la question suivante $num_question++ ; $num_essai = 1; } } } ?> <?php if($num_question <= $nb_question): ?> <form method="POST" action="affichage_questionnaire.php" name="formulaire" onSubmit="return check();" > <p> <input type="hidden" name="num_question" value="<?php echo $num_question ?>" /> <input type="hidden" name="num_essai" value="<?php echo $num_essai ?>" /> <input type="hidden" name="nombre_points" value="<?php echo $nombre_points ?>" /> <?php echo $msg ; ?><br /> <?php echo $questions[$num_question-1] ; ?><br /><br /> Votre réponse (essai numéro <?php echo $num_essai ?>): <input type="text" name="reponse" /> <input type="submit" value="Valider" /> <br /><br /> Votre score: <?php echo $nombre_points ; ?> </p> </form> <?php else: ?> <p> <?php echo $msg ; ?> Fin du questionnaire.<br /> Votre score: <?php echo $nombre_points ; ?> </p> <?php endif; ?> </body> </html>

Eléphanteau du PHP | 11 Messages

15 déc. 2013, 16:22

Après avoir intégré les tableaux de ma base de données le questionnaire ne fonctionne pas comme il le devrait.

Il va finalement valider la première question, mais il va aller automatiquement (si la réponse est juste) à la fin du questionnaire. Et l'annoncer.

J'aimerais savoir comment je peux faire ? et d'où viens le problème.




<html>
<head>
	<meta charset="utf-8" /><!--[if lt IE 9]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>   /*Permet la comptabilit� des en-t�te et piege de page et etc.. avec les anciennes versions de IE*/
        <![endif]-->
		<link href="style.css" rel="stylesheet" /><!--ceci c'est commantaire-->
		
   <script type="text/javascript">
      function check()
      {
         //verification reponse non vide
         if (document.formulaire.reponse.value == "")
         {
            alert("Veuillez saisir votre reponse !");
            return(false);
         }
         
         return(true);
      }
   </script>
</head>
<body>
<div id ="bloc-page">
<header>
<?php include("header.php"); ?>
</header>

<nav>

<?php include("menu.php"); ?>
</nav>

<section>
<?php

	try
	{	
		$bdd = new PDO('mysql:host=localhost;dbname=islandle_o****1', 'isl******', '*************');
	}
	Catch (Exception $e)
	{
		Die('Erreur : ' . $e->getMessage());
	}
	$req = $bdd->query('SELECT * FROM questions');

	$donnees = $req->fetch();

   $questions   = array($donnees['question']);
   $reponses    = array($donnees['reponse']);
   $nb_question = count($questions);
   
   if(empty($_POST['num_question']))
   {
      $num_question  = 1;
      $num_essai     = 1;
      $nombre_points = 0;
      $msg           = "" ;
   }
   else
   {
      $num_question  = $_POST['num_question'] ;
      $num_essai     = $_POST['num_essai'] ;
      $reponse       = $_POST['reponse'] ;
      $nombre_points = $_POST['nombre_points'] ;
      
      $num_essai++ ;
      
      if($reponse == $reponses[$num_question-1])
      {
         $msg = 'Bonne réponse, vous gagnez un point !

' ;
         $nombre_points ++;
         //on passe à la question suivante
         $num_question++ ;
         $num_essai     = 1;
      }
      else
      {
         if($num_essai <= 2)
         {
            $msg  = 'Réponse fausse.

' ;
         }
         else
         {
            $msg   = 'Vous avez échoué à la question '.$num_question.' 
' ;
            $msg  .= 'La bonne réponse était: '.$reponses[$num_question-1].'

' ;
            //on passe à la question suivante
            $num_question++ ;
            $num_essai  = 1;
         }
      }
   }
   ?>
   
   
   <?php if($num_question <= $nb_question): ?>
   
      <form method="POST" action="affichage_questionnaire.php" name="formulaire"  onSubmit="return check();" >
      <p>
         <input type="hidden" name="num_question" value="<?php echo $num_question ?>" />
         <input type="hidden" name="num_essai" value="<?php echo $num_essai ?>" />
         <input type="hidden" name="nombre_points" value="<?php echo $nombre_points ?>" />
         
         <?php echo $msg ; ?>

         <?php echo $questions[$num_question-1] ; ?>


         Votre réponse (essai numéro <?php echo $num_essai ?>): <input type="text" name="reponse" />
         <input type="submit" value="Valider" />
         


         Votre score: <?php echo $nombre_points ; ?>
      </p>
      </form>
   <?php else: ?>
      <p>
      <?php echo $msg ; ?>
      Fin du questionnaire.

      Votre score: <?php echo $nombre_points ; ?>
      </p>
   <?php endif; ?>
</body>
</html>


Eléphanteau du PHP | 46 Messages

15 déc. 2013, 18:11

salut

essayes de remplacer le fetch de $donnees = $req->fetch() par un fetchAll
parce que avec un fecth tu n'as qu'une ligne et avec un fetchAll tu les as toutes

Eléphanteau du PHP | 11 Messages

15 déc. 2013, 21:07

Non, ça ne va pas puisque le problème c'est que ça prendre tout et non pas tout un par un. J'ai essayé mais ça ne fonctionne pas ..
salut

essayes de remplacer le fetch de $donnees = $req->fetch() par un fetchAll
parce que avec un fecth tu n'as qu'une ligne et avec un fetchAll tu les as toutes

Eléphanteau du PHP | 46 Messages

16 déc. 2013, 09:36

Il va finalement valider la première question, mais il va aller automatiquement (si la réponse est juste) à la fin du questionnaire. Et l'annoncer.
J'aimerais savoir comment je peux faire ? et d'où viens le problème.
le pb viens de ton fetch
fais un var_dump( $nb_question )
pour voir combien tu as de questions

Eléphanteau du PHP | 11 Messages

16 déc. 2013, 19:54

Cela m'affiche 1 quand je laisse avec fetch et lorsque je met fetchAll cela me met 0 .

Merci
Il va finalement valider la première question, mais il va aller automatiquement (si la réponse est juste) à la fin du questionnaire. Et l'annoncer.
J'aimerais savoir comment je peux faire ? et d'où viens le problème.
le pb viens de ton fetch
fais un var_dump( $nb_question )
pour voir combien tu as de questions

Eléphanteau du PHP | 46 Messages

16 déc. 2013, 21:04

si le var_dump t'affiche 1 c'est bien ce que je pensais !
c'est la cause de ton pb, tu ne récupères qu'une seule question !
Par contre qu'il t'affiche 0 avec fetchAll c'est pas normal...
le pb viens uniquement de la récupération des questions et réponses dans la base de données, cherches de ce coté à mon avis

Mammouth du PHP | 2278 Messages

16 déc. 2013, 21:47

Je suppose que dans la;BDD les questions sont dans des enregistrements distincts et repérables par un id croissant et continu.
Apppelant
/*On suppose que dans le programme appelant, toutes ces valeurs de $_SESSION ont été initialisées:
<?PHP
session_start();
$_SESSION['numero_question'] = 1;
$_SESSION['nombre_essais'] = 0;
*/
appelé
<?PHP
session_start();
$moyen_de_repérer_le_questionnaire_dans_la_bdd = $_SESSION['moyen_de_repérer_le_questionnaire_dans_la_bdd'];
$numero_question = $_SESSION['numero_question'];
$nombre_essais = $_SESSION['nombre_essais'];
interroger la BDD avec where num_question = $numero_question;
$_SESSION['nombre_essais'] = $_SESSION['nombre_essais']+1;
Affichage de la question et appel à corriger.php
sUITE AU PROCHAIN NUMÉRO
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 11 Messages

17 déc. 2013, 08:30

J'en n'ai pas de système de session justement
Je suppose que dans la;BDD les questions sont dans des enregistrements distincts et repérables par un id croissant et continu.
Apppelant
/*On suppose que dans le programme appelant, toutes ces valeurs de $_SESSION ont été initialisées:
<?PHP
session_start();
$_SESSION['numero_question'] = 1;
$_SESSION['nombre_essais'] = 0;
*/
appelé
<?PHP
session_start();
$moyen_de_repérer_le_questionnaire_dans_la_bdd = $_SESSION['moyen_de_repérer_le_questionnaire_dans_la_bdd'];
$numero_question = $_SESSION['numero_question'];
$nombre_essais = $_SESSION['nombre_essais'];
interroger la BDD avec where num_question = $numero_question;
$_SESSION['nombre_essais'] = $_SESSION['nombre_essais']+1;
Affichage de la question et appel à corriger.php
sUITE AU PROCHAIN NUMÉRO