Probléme questionnaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probléme questionnaire

Re: Probléme questionnaire

par mailoy » 26 déc. 2013, 13:42

Justement j'aimerais faire ça sans avoir a faire de session ce qui compliquerait le code, alors que je pense qu'il y a la possibilité de faire de faire sans.

Re: Probléme questionnaire

par sirakawa » 17 déc. 2013, 12:49

Les sessions sont inhérentes à PHP, assez faciles à maitriser, et très commodes pour passer de l'information d'un script à un autre.
Exemple testé sous Windaube 7 avec easyphp (xampp m'a fait des misères)
<?PHP
session_start();
/*le point FONDAMENTAL est de mettre session_start à la ligne qui suit <?PHP sans ligne intermédiaire*/
$nom_utilisateur = "Toto les belles mirettes";
$_SESSION['nom'] = $nom_utilisateur;
print_r($_SESSION);
print"
<form method ='post' action = 'teste.php' >
<button type = 'submit'> Continuer</button>
</form>";
?>
et
<?PHP
session_start();
print_r($_SESSION);
$nom_utilisateur = $_SESSION['nom'];
print "$nom_utilisateur";
?>
Il y a la possibilité de faire la même chose avec des posts, ce que j'ai longtemps fait, mais c'est plus pénible:
exemple:
<?PHP
print"
<form method = 'post' action ='tester1.php'>
<input type='hidden' name ='nom' value ='$nom' />
<button type ='submit'>Continuer</button>
</form>";
?>
et
<?PHP
$nom_utilisateur = $_POST['nom'];
print "$nom_utilisateur";
?>
Sur l'exemple ça va parce que je n'ai qu'une variable à passer. L'autre problème c'est que, à chaque fois qu'on change de script;, il faut refaire les <input type ='hidden'... > et les $var = $_POST['var'], alors qu'avec les sessions, c'est fait le temps de la connexion.

Re: Probléme questionnaire

par mailoy » 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

Re: Probléme questionnaire

par sirakawa » 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

Re: Probléme questionnaire

par nico63800 » 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

Re: Probléme questionnaire

par mailoy » 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

Re: Probléme questionnaire

par nico63800 » 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

Re: Probléme questionnaire

par mailoy » 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

Re: Probléme questionnaire

par nico63800 » 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

Re: Probléme questionnaire

par mailoy » 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>

Re: Probléme questionnaire

par mailoy » 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>

Re: Probléme questionnaire

par nico63800 » 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>

Re: Probléme questionnaire

par mailoy » 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.


@+

Re: Probléme questionnaire

par moogli » 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.


@+

Re: Probléme questionnaire

par mailoy » 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 ;)


@+