Problème de formulaire à comparer à la bdd

Petit nouveau ! | 2 Messages

26 janv. 2012, 00:06

Bonsoir,

Voilà pour que vous compreniez mon problème j'expose rapidement le but du truc. Déjà voici ma table nommée "mots_faciles" :

id -- lettres_desordre -- bonne_reponse -- bonne_reponse1

1 // A-V-E-H-C // vache // Vache
2 .......... ..... .....

Voici le but de mon code : Je selectionne dans ma table aléatoirement une ligne de "lettres_desordre". L'utilisateur doit ensuite entrer la réponse. Si la réponse entrée est la bonne, alors ça affiche "bonne reponse", sinon ça affiche "mauvaise reponse". Dans l'idée, c'est simple.

Voici mon code :
 

   <?php $mot = $bdd->query('SELECT lettres_desordre FROM mots_faciles ORDER by rand ()');
    $donnees1 = $mot->fetch();
	?>
		<div id = "lettres"><?php echo $donnees1['lettres_desordre']; ?> </div>
	

	
	<form method = "post" action = "jeu_f.php">
	
    <div id = "reponse1"><label for = "reponse">Votre réponse :</label></div><div id = "reponse2"><input type = "text" id = "reponse" name = "reponse" maxlength = "15"/></div>
    <div id = "validation"><input type = "submit" value = "Valider la réponse"/></div>    
    
    <?php
	
     
	$reponse = $bdd->query('SELECT lettres_desordres, bonne_reponse, bonne_reponse1 FROM mots_faciles WHERE lettres_desordre = $mot');
	$donnees2= $reponse->fetch();

?>	

<?php
	if($_POST['reponse'] == $donnees2['bonne_reponse'] OR $donnees2['bonne_reponse1'])
	{
	 ?>
	 <div id = "bonnerep">Bonne reponse !</div>
	 <?php
	 }
	 else
	 {
	 ?>
	 <div id = "mauvaiserep">Mauvaise reponse !</div>
	 <?php
	 }
}
 	
	catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}  
	?>  
Le raisonnement de mon code est le suivant : Je sélectionne avec la requête le mot au hasard qui s'affiche. Ce bout fonctionne. Le formulaire propose d'écrire la réponse et la cible est la même page. Je fais ensuite une autre requête ou ej sélectionne la bonne réponse qui correspond à la ligne "lettres_desordre" qui a été choisis dans la requête $mot. Enfin je termine par une comparaison : Si la réponse vaut les bonnes réponses de la ligne "lettres_desordre" choisis aléatoirement, alors ça affiche bonne réponse, sinon non.

Cependant ce code ne fonctionne pas et j'ai beau chercher je ne vois pas.. Merci à tout ceux qui pourront m'aider !

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

26 janv. 2012, 10:58

salut,

le problème viens du fait que tu confond les chaines de caractères avec " et '. celle délimitée par des ' n'interprètent pas les comme des variables le $truc qui s'y trouve (au contraire de celle délimité par des " ).

ta variable $mot contient un objet PDOStatement ta requête "reponse" ne peux donc fonctionner ainsi (en omettant le problème indiqué ci dessus)

de plus en SQL une chaine doit être délimitée par des '. donc soit tu les ajoute, soit, et c'est préférable, tu utilise la méthode quote de la classe PDO ;)

coté SQL :
- si le SGBD est Mysql utilise la clause LIMIT 1 opur ne pas récupérer toute la table alors que tu n'a besoin que d'un seul tuple.
- tu devrais avoir deux tables, une pour le mot en vrac et avec les réponses.
table vrac
idvrac : clef primaire
lettre

table reponse
idreponse : clef primaire
idvrac : référence à la première table
reponse la réponse possible

avec ça tu peux avoir plusieurs (autant que tu veux) par "question" de la première table
pour savoir si la réponse est bonne un simple
select count(*) from reponse where idvrac=$idvrac and reponse =$reponse

et tu passe $idvrac et $reponse proviennent de ton formulaire.

Il te faut vérifier l'existence des infos fournie par le formulaire a l'aide des fonctions isset / empty

exemple de validation de formulaire => http://www.phpdebutant.org/article56.php

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

Petit nouveau ! | 2 Messages

26 janv. 2012, 20:23

Bonsoir,

Je te remercie pour ta réponse.

Cependant après encore une nuit de réflexion, j'ai enfin trouvé une solution au problème et au final très simple.
<?php
    
	//Sélection d'un mot au hasard et de sa réponse
		$mot = $bdd->query('SELECT lettres_desordre, bonne_reponse FROM mots_faciles_vrac ORDER by rand ()');
        $donnees1 = $mot->fetch();
        
		$_SESSION['correction'] = $donnees1['bonne_reponse'];
	?>
Sur la page de la question (ou il ya le mot en désordre) je sélectionne la bonne reponse en même temps que les lettres. rand() prend une ligne entière au hasard, donc forcement la bonne réponse correspondante à chaque fois.
J'enregistre la valeur de la bonne réponse correspondant au mot sortit dans une variable SESSION pour pouvoir la transporter dans la page des réponses. Dans la page reponse j'ai :
if(htmlspecialchars($_POST['reponse']) == $_SESSION['correction''])
	{
	?>
		<div id = "bonnerep">Bonne reponse ! </div>
	<?php
    }
	else
	{
	?>   
       <div id = "mauvaiserep">Mauvaise reponse ! </div>	

   <?php
	}
Je compare la réponse ( au fait merci pour le rappel de la protection, je connais les risques de la faille XSS et des injections, mais vu que mon code est en construction j'ai pas encore sécurisé cette page) que l'utilisateur à donné avec le mot qui est sortit lors de la question (et que j'ai donc enregistré dans $_SESSION['correction']).

Tout marche parfaitement !

Je sais pas trop si la façon de faire est correcte, mais j'ai trouvé que c'était tout de même assez simple comme technique/