Problème de vrai ou faux.... QCM

Résolu/Fermé
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 14 mai 2017 à 17:06
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 17 mai 2017 à 19:53
Bonjour,

Voila j'aimerai faire un jeux de questions mais le problème déjà sais que une fois ma table de question faite avec les propositions et la réponse parmi ces proposition de réponse de façon aléatoire.

Mais parfois quand je valide la bonne réponse il me dit que la réponse est fausse.
Pouvez vous m'aider a corriger ce problème merci d'avance.

<?php
session_start();
include ('cobdd.php');
$nbrQ = $bdd->query('SELECT * FROM questions');
$nbrQ->fetch();
$nbr = $nbrQ->rowCount();
$id_question = mt_rand(1, $nbr);


$req_questions = $bdd->prepare('SELECT * FROM questions WHERE id = ?');
$req_questions->execute(array($id_question));
$Q = $req_questions->fetch();
?>


<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
<?php 
	$al_R = mt_rand(1, 4);
	if($al_R == 1)
	{
		$r1 = $Q['reponse'];
		$r2 = $Q['choix1'];
		$r3 = $Q['choix2'];
		$r4 = $Q['choix3'];
	}
	if($al_R == 2)
	{
		$r1 = $Q['choix1'];
		$r2 = $Q['reponse'];
		$r3 = $Q['choix2'];
		$r4 = $Q['choix3'];
	}
	if($al_R == 3)
	{
		$r1 = $Q['choix1'];
		$r2 = $Q['choix2'];
		$r3 = $Q['reponse'];
		$r4 = $Q['choix3'];
	}
	if($al_R == 4)
	{
		$r1 = $Q['choix1'];
		$r2 = $Q['choix2'];
		$r3 = $Q['choix3'];
		$r4 = $Q['reponse'];
	}
if(isset($_POST['ok']))
{
	if($_POST['reponse'] == $Q['reponse'])
	{
		echo 'Bravo bonne réponse !';
	}
	else
	{
		echo "Mauvaise réponse";
	}
}else{	
	
	
?>

<h3><?= $Q['question'] ?></h3>
<form method="POST">
	<input type="radio" id="r1" name="reponse" value="<?= $r1 ?>" /> <label for="r1"><?= $r1 ?></label></br>
	<input type="radio" id="r2" name="reponse" value="<?= $r2 ?>" /> <label for="r2"><?= $r2 ?></label></br>
	<input type="radio" id="r3" name="reponse" value="<?= $r3 ?>" /> <label for="r3"><?= $r3 ?></label></br>
	<input type="radio" id="r4" name="reponse" value="<?= $r4 ?>" /> <label for="r4"><?= $r4 ?></label></br></br></br>
	<input type="submit" name="ok" value="Valider" />
</form>


<?php
	}
?>

</body>
</html>




5 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 17 mai 2017 à 00:57
Je me suis fait plaisir ... :-)

<?php
Bon ... un peu marre du code mode brouillon précédent ^^
Je pense qu'en faisant une class .. ça sera plus simple et plus clair..

Donc.. créé un fichier : qcm.class.php

<?php
// Fichier : qcm.class.php
class qcm{
 public $id_q;
 private $bdd = NULL;l
 
 /**
 * Constructeur de la class.
 * On lui passe l'objet $bdd en paramètre
 */
 function __construct($oBdd = NULL;){
    $this->bdd = $oBdd;
  }
  
  /**
  * Permet d'exécuter une requête
  * $sql @string : requete sql
  * $datas @array (par défaut = NULL) : array des paramètres de la requete
  * $fetch : par défaut est à true.
  * Pour une requête de type INSERT / DELETE ou UPDATE .. mettre ce paramètre à false lors de l'appel de la fonction
  * return @array si la variable $fetch = true
  */
  private function queryExec($sql,$datas=NULL,$fetch=true){
    $result = NULL;
    try{
      $requete = $this->bdd->prepare($sql) ;
      $requete->execute($datas) ;
      $result = $fetch ? $requete->fetchAll() : NULL;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    return $result;
  }
  
  
  /**
  * Recupère la liste de TOUTES tes questions
  * (fonction non utilisée actuellement)
  * return @array
  */
  public function get_all_questions(){
    $sql = "SELECT * FROM questions ORDER BY id";
    return $this->queryExec($sql);
  }
  
  /**
  * Récupère une question en fonction de son id
  * return @array
  */
  public function get_question_by_id($id){
    $sql = "SELECT * FROM questions WHERE id =:id ORDER BY id";
    $datas = array(":id"=>$id);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * Récupère une question aléatoire (directement en sql )
  */
  public function get_random_question(){
    $sql = "SELECT * FROM questions ORDER BY RAND() LIMIT 1";
    $result = $this->queryExec($sql);*
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * Récupère les réponses en fonction d'un id question
  * return @array
  */
  public function get_reponses_by_id_question($id_question = NULL){
   $return = array();
   
   if($id_question){
    $sql = "SELECT * FROM questions WHERE id_question =:id_question ORDER BY id";
    $datas = array(":id_question"=>$id_question);
    $result = $this->queryExec($sql,$datas);
    foreach($result as $R){
     $return[$R['id']] = $R;
    }
   }
   return $return;
  }
  
  /**
  * Vérifie si la réponse donnée est la bonne
  * retourne true si vrai .. sinon false
  */
  public function check_if_good_answer($rep_user,$id_question){
    $q = $this->get_reponses_by_id_question($id_question);
    return ($q[$rep_user]['correct'] == 1) ? true : false;
  }
  
  
//fin de la class
}
?>


puis tu modifies ton code comme ceci :
<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

function debug($var,$title=NULL){
 echo "<pre><br>-------------------------<br>";
 if($title){
  echo "<b><u> **** ".$title." **** </b></u>:<br>";;
 }
 if(is_array($var)){
  print_r($var);
 }else{
  echo $var;
 }
 echo "<br>-------------------------<br></pre>";
}

//-------------------------------------------------------------------//
//connexion à la BDD
//-------------------------------------------------------------------//
require_once ('cobdd.php');

//-------------------------------------------------------------------//
// Require de la class et instanciation
//-------------------------------------------------------------------//
require_once ('qcm.class.php');
$oQcm = new qcm($bdd);

//-------------------------------------------------------------------//
//récupération PROPRE des variables AVANT de les utiliser
//-------------------------------------------------------------------//
$rep_user = !empty($_POST['reponse']) ? $_POST['reponse'] : NULL;
$id_q     = !empty($_POST['id_q']) ? $_POST['id_q'] : NULL;

//-------------------------------------------------------------------//
// recup de la question
//-------------------------------------------------------------------//
$a_questions = $id_q ? $oQcm->get_question_by_id($id_q) : $oQcm->get_random_question($id_q);
debug($a_questions,'a_questions');

$id_question = !empty($id_q) ? $id_q : (!empty($a_questions) ? $a_questions['id'] : NULL) ;
debug($id_question,'id_question'); 

//-------------------------------------------------------------------//
// recup des réponses de la question
//-------------------------------------------------------------------//
$a_rep = $oQcm->get_reponses_by_id_question($id_question);
 debug($a_rep,'a_rep'); 
 
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
  if($rep_user && $id_q) {
   $verif_rep = $oQcm->check_if_good_answer($rep_user,$id_q)
   debug($verif_rep,'verif_rep'); 
   if($verif_rep){
    echo "Bravo bonne réponse !</br></br>";
    echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Retour</a>";
   }else{
    echo "Mauvaise réponse</br></br>";
    echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Retour</a>";
   }
  }
  
  //le temps des tests
  if(!empty($_POST)){
    debug($_POST,' Variables POST ';
  }
?>

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <?php
 if(!$id_q && !empty($a_questions)){
   echo "<h3>".$a_questions['question']."</h3>
       <form method='POST' action=''>
       <!-- champ caché contenant l'id de la question aléatoire -->
       <input type='hidden' name='id_q' value='".$id_question."'>";
   if(!empty($a_rep)){   
     foreach($a_rep as $Q){
       echo "<input type='radio' id='".$Q['id']."' name='reponse' value='".$Q['id']."'/> 
             <label for='".$Q['id']."'>".$Q['reponse']."</label></br>";
     }
   }
  echo"</br></br>";
  echo"<input type='submit' name='ok' value='Valider' />";
  echo "</form>";
 }
 ?>
 </body>
</html>


Cordialement, 
Jordane                                                                 
1
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
17 mai 2017 à 07:18
Bonjour je vous remercie donc voila ça fonctionne j'ai modifier la table ou on vas chercher id_reponse qui est dans la table reponse.

Voici les fichiers modifier :

qcm.class.php
<?php
// Fichier : qcm.class.php
class qcm{
 public $id_q;
 private $bdd = NULL;
 
 /**
 * Constructeur de la class.
 * On lui passe l'objet $bdd en paramètre
 */
 function __construct($oBdd = NULL){
    $this->bdd = $oBdd;
  }
  
  /**
  * Permet d'exécuter une requête
  * $sql @string : requete sql
  * $datas @array (par défaut = NULL) : array des paramètres de la requete
  * $fetch : par défaut est à true.
  * Pour une requête de type INSERT / DELETE ou UPDATE .. mettre ce paramètre à false lors de l'appel de la fonction
  * return @array si la variable $fetch = true
  */
  private function queryExec($sql,$datas=NULL,$fetch=true){
    $result = NULL;
    try{
      $requete = $this->bdd->prepare($sql) ;
      $requete->execute($datas) ;
      $result = $fetch ? $requete->fetchAll() : NULL;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    return $result;
  }
  
  
  /**
  * Recupère la liste de TOUTES tes questions
  * (fonction non utilisée actuellement)
  * return @array
  */
  public function get_all_questions(){
    $sql = "SELECT * FROM questions ORDER BY id";
    return $this->queryExec($sql);
  }
  
  /**
  * Récupère une question en fonction de son id
  * return @array
  */
  public function get_question_by_id($id){
    $sql = "SELECT * FROM questions WHERE id =:id ORDER BY id";
    $datas = array(":id"=>$id);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * Récupère une question aléatoire (directement en sql )
  */
  public function get_random_question(){
    $sql = "SELECT * FROM questions ORDER BY RAND() LIMIT 1";
    $result = $this->queryExec($sql);
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * Récupère les réponses en fonction d'un id question
  * return @array
  */
  public function get_reponses_by_id_question($id_question = NULL){
   $return = array();
   
   if($id_question){
    $sql = "SELECT * FROM reponse WHERE id_question =:id_question ORDER BY id";
    $datas = array(":id_question"=>$id_question);
    $result = $this->queryExec($sql,$datas);
    foreach($result as $R){
     $return[$R['id']] = $R;
    }
   }
   return $return;
  }
  
  /**
  * Vérifie si la réponse donnée est la bonne
  * retourne true si vrai .. sinon false
  */
  public function check_if_good_answer($rep_user,$id_question){
    $q = $this->get_reponses_by_id_question($id_question);
    return ($q[$rep_user]['correct'] == 1) ? true : false;
  }
  
  
//fin de la class
}
?>



Après le fichier de questions :

<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

function debug($var,$title=NULL){
 echo "<pre><br>-------------------------<br>";
 if($title){
  echo "<b><u> **** ".$title." **** </b></u>:<br>";
 }
 if(is_array($var)){
  print_r($var);
 }else{
  echo $var;
 }
 echo "<br>-------------------------<br></pre>";
}

//-------------------------------------------------------------------//
//connexion à la BDD
//-------------------------------------------------------------------//
require_once ('cobdd.php');

//-------------------------------------------------------------------//
// Require de la class et instanciation
//-------------------------------------------------------------------//
require_once ('qcm.class.php');
$oQcm = new qcm($bdd);

//-------------------------------------------------------------------//
//récupération PROPRE des variables AVANT de les utiliser
//-------------------------------------------------------------------//
$rep_user = !empty($_POST['reponse']) ? $_POST['reponse'] : NULL;
$id_q     = !empty($_POST['id_q']) ? $_POST['id_q'] : NULL;

//-------------------------------------------------------------------//
// recup de la question
//-------------------------------------------------------------------//
$a_questions = $id_q ? $oQcm->get_question_by_id($id_q) : $oQcm->get_random_question($id_q);
debug($a_questions,'a_questions');

$id_question = !empty($id_q) ? $id_q : (!empty($a_questions) ? $a_questions['id'] : NULL) ;
debug($id_question,'id_question'); 

//-------------------------------------------------------------------//
// recup des réponses de la question
//-------------------------------------------------------------------//
$a_rep = $oQcm->get_reponses_by_id_question($id_question);
 debug($a_rep,'a_rep'); 
 
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
  if($rep_user && $id_q) {
   $verif_rep = $oQcm->check_if_good_answer($rep_user,$id_q);
   debug($verif_rep,'verif_rep'); 
   if($verif_rep){
    echo "Bravo bonne réponse !</br></br>";
    echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
   }else{
    echo "Mauvaise réponse</br></br>";
    echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
   }
  }
  
  //le temps des tests
  if(!empty($_POST)){
    debug($_POST,' Variables POST ');
  }
?>

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <?php
 if(!$id_q && !empty($a_questions)){
   echo "<h3>".$a_questions['question']."</h3>
       <form method='POST' action=''>
       <!-- champ caché contenant l'id de la question aléatoire -->
       <input type='hidden' name='id_q' value='".$id_question."'>";
   if(!empty($a_rep)){   
     foreach($a_rep as $Q){
       echo "<input type='radio' id='".$Q['id']."' name='reponse' value='".$Q['id']."'/> 
             <label for='".$Q['id']."'>".$Q['reponse']."</label></br>";
     }
   }
  echo"</br></br>";
  echo"<input type='submit' name='ok' value='Valider' />";
  echo "</form>";
 }
 ?>
 </body>
</html>


Voila ça fonctionne plus qu'a enlever les debug :) ( du moins je vais y garder de coté car cette méthode est super pour voir ce qui ce passe pendant le développement.

Puis bas je vais passer a l'étape 2 qui est de l'imiter l’utilisateur a 10 questions par jour et enregistrer les questions que l’utilisateur a faites. Et lui attribuer des points suivant les bonnes réponses données.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 mai 2017 à 09:42
N'oublie pas de mettre le sujet en resolu
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
17 mai 2017 à 19:38
Bonsoir je viens de regarder en détail mais les réponses la première est toujours la bonne réponses, et j'aurai aimer que les réponses arrive aléatoirement.

Comme je voulait faire en premier....
Je dois juste modifier un truc a mon avis pour arriver a cela....
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
17 mai 2017 à 19:53
J'ai trouver :)

/**
  * Récupère les réponses aléatoire (directement en sql )
  * return @array
  */
  public function get_reponses_by_id_question($id_question = NULL){
   $return = array();
   
   if($id_question){
    $sql = "SELECT * FROM reponse WHERE id_question =:id_question ORDER BY RAND()";
    $datas = array(":id_question"=>$id_question);
    $result = $this->queryExec($sql,$datas);
    foreach($result as $R){
     $return[$R['id']] = $R;
    }
   }
   return $return;
  }


Merci grâce aux commentaires sais super simple pour modifier :)
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 mai 2017 à 17:44
bonjour,

Plusieurs choses ne vont pas ...
déjà ...
$nbr = $nbrQ->rowCount()

RowCount sert à déterminer le nombre de lignes affectées par un delete ou un update ... et il est déconseillé de l'utiliser pour un select.
Voir la doc :

Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.

A la place .. on fera un fecthall sur le résultat de la requête.. puis un count de l'array obtenu.

Ensuite.. pour ce qui est du random...
Soit tu le fais directement en mysql
http://jan.kneschke.de/projects/mysql/order-by-rand/

Soit (vu que maintenant suite à ma première remarque tu as un joli array qui contient toutes les données....) il suffit d'appliquer le random sur l'array au lieu de refaire une requête...
Tu peux même utiliser une fonction comme array_rand. https://www.php.net/manual/fr/function.array-rand.php

Idem pour les réponses .. au lieu de faire 4 IF ( qui auraient été mieux avec un switch....) tu peux sûrement les mélanger via un shuffle https://www.php.net/manual/fr/function.shuffle.php



Pour finir ... histoire de débuguer ton code et essayer de voir où ça bloque... et bien... il va falloir faire des ECHO de tes variables et même un print_r($_POST); pour voir ce qu'elles contiennent......
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
14 mai 2017 à 22:13
Merci pour votre réponse, donc après avoir chercher donc la première méthode le random directement en SQL. Vu que j'ai pas beaucoup d'information même dans mon livre PHP 7.

Donc je vais me tourner vers array, j'ai trouver quelque chose sur mon livre qui s’appuie sur cela
void shuffle(array $tab)
bon il est indiquer qu'il est généralement recommander d’initialiser un générateur de nombre aléatoire avec le fonction srand().

Et j'ai aucune information sur array_rand dans mes livres que ça sois php 7 cours et exercice et php 7 avancé.......

Vu que array je l’utilise juste pour exécuter ma requête SQL.

Aussi vu que maintenant je me bloque jamais sur un problème j'ai déjà modifier le code avant de voir votre réponse.

J'ai une table reponse et une table questions.

Donc j'ai contourner le problème.....

Voila ou j'en suis mais bon comme vous l'avez dit j’utilise pas les bonnes pratiques donc je vais faire en sorte de faire les choses bien pour une fois....


<?php
session_start();
include ('cobdd.php');

$nbrQ = $bdd->query('SELECT * FROM questions');
$nbrQ->fetch();
$nbr = $nbrQ->rowCount();
$id_question = mt_rand(1, $nbr);

$question = $bdd->prepare('SELECT * FROM questions WHERE id = ?');
$question->execute(array($id_question));
$R = $question->fetch();

$req_reponses = $bdd->prepare('SELECT * FROM reponse WHERE id_question = ?');
$req_reponses->execute(array($R['id']));


	if(isset($_POST['reponse']) AND !empty($_POST['reponse']))
	{
		$ici_reponse = $_POST['reponse'];
		$verif_rep = $bdd->prepare('SELECT * FROM reponse WHERE id = ?');
		$verif_rep->execute(array($ici_reponse));
		$VR = $verif_rep->fetch();
		
		if($VR['correct'] == 1)
		{
			echo "Bravo bonne réponse !</br></br>";
			echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
		}
		else
		{
			echo "Mauvaise réponse</br></br>";
			echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
		}
	}




?>


<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
<?php
if(isset($_POST['reponse']) AND !empty($_POST['reponse']))
	{
	}else{
?>
<h3><?= $R['question'] ?></h3>
<form method="POST">
<?php while($Q = $req_reponses->fetch()) 
{	
?>
	<input type="radio" id="<?= $Q['id'] ?>" name="reponse" value="<?= $Q['id'] ?>" /> <label for="<?= $Q['id'] ?>"><?= $Q['reponse'] ?></label></br>
<?php
	}
?>
	</br></br>
	<input type="submit" name="ok" value="Valider" />
</form>
<?php
} ?>
	


</body>
</html>


Voici ça fonctionne, mais j'ai toujours ma réponse vrai en première proposition donc je vais tester le array afin de mélanger les réponses.
J'espère trouver comme cela marche :)
0
Utilisateur anonyme
14 mai 2017 à 17:55
Bonjour

En plus des problèmes de programmation que t'a indiqués Jordane, tu as un problème de principe.
Comme tout script php qui affiche un formulaire et traite l'envoi, ton script est exécuté deux fois : une première fois pour afficher les propositions et une deuxième fois pour vérifier la réponse.
Tu fais donc deux tirages au sort pour déterminer la position de la bonne réponse : une première fois pour afficher, une deuxième fois pour vérifier.

Il faut que quand tu affiches les propositions, tu mémorises quel est la bonne réponse, dans une variable de session ou un champ caché du formulaire par exemple.
Quand tu analyses la réponse, tu tiens dois te baser sur cette valeur mémorisée plutôt que sur un nouveau tirage au sort qui, par définition, n'a aucun rapport avec le tirage précédent.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
15 mai 2017 à 01:32
Bonjour,

Déjà .. On active, si ce n'est pas déjà fait, l'affichage des erreurs PDO dans le fichier de connexion
<?php
//fichiercobdd.php

try{
$bdd =new PDO('mysql:host=localhost; dbname=MaBase; charset=utf8', 'root', '');
// Activation des erreurs PDO
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}
?>


Ensuite,
-on essaye autant que possible de placer le maximum de son code php AVANT le HTML
(Cela le rend plus lisible.. et donc plus maintenable.)
- On récupère proprement les variable via l'écriture ternaire et les isset ou !empty
- On évite d'ouvrir/fermer les balises PHP à tout bout de champ...
- On place ses requêtes dans les blocs Try/catch
- On active l'affichage des erreurs php
- On évite le rowCount
- ...etc...

Et enfin .. pas besoin des variables de session .. il suffit de transmettre l'id de la question dans le formulaire
en utilisant un input hidden par exemple.


Voila :
<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');


//connexion à la BDD
require_once ('cobdd.php');

//récupération PROPRE des variables AVANT de les utiliser
$rep_user = !empty($_POST['reponse']) ? $_POST['reponse'] : NULL;
$id_q = !empty($_POST['id_q']) ? $_POST['id_q'] : NULL;

//-------------------------------------------------------------------//
// récupération de la liste des questions et des réponses 
//-------------------------------------------------------------------//
 //préparation de la requête et des variables
 
 //si c'est après l'envoi du formulaire et qu'il y a un id de question :
 $strwhere = "";
 $datas = NULL;
 if($id_q){
   $strwhere = " WHERE id : ? ";
   $datas = array($id_q);
 }
 
 $sql = "SELECT * 
         FROM SELECT * FROM questions
         $strwhere ";


  //Execution de la requete
  try{
    $requete = $bdd->prepare($sql) ;
    $requete->execute($datas) ;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }
  
  //on transorme le resultat de la requete en array
  $a_result = $requete->fetchAll();
  
  //on compte le nombre de questions :
  $nbr = count($a_result);

  // id de la question si envoyée dans le formulaire.. sinon aléatoire
  $id_question = $id_q ? $id_q : mt_rand(1, $nbr);

  //on récupère la question dans l'array
  $question = !empty($a_result) ? $a_result[$id_question-1] : NULL; 

  if(!empty($question)){
   //préparation de la requête et des variables
   $sql = "SELECT * FROM reponse WHERE id_question = ?";
   $datas = array($question['id']);

    //Execution de la requete
    try{
      $requete = $bdd->prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    
    //on stocke les réponse dans un array
    $reponses = $requete->fetchAll();
    //on randomize les réponses:
    if(!empty($reponses)){
     shuffle($reponses);
    }

  }
   
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
if($rep_user && !empty($reponses))	{
	$verif_rep = $reponses[$rep_user];
		
	if($verif_rep == 1){
		echo "Bravo bonne réponse !</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}else{
		echo "Mauvaise réponse</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}
}

?>

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <?php
 if(!$id_q && !empty($question)){
   echo "<h3>".$question['question']."</h3>
       <form method='POST' action=''>
       <!-- champ caché contenant l'id de la question aléatoire -->
       <input type='hidden' name='id_q' value='".$id_question."'>";
   if(!empty($reponses)){   
     foreach($reponses as $Q){
       echo "<input type='radio' id='".$Q['id']."' name='reponse' value='".$Q['id']."'/> 
             <label for='".$Q['id']."'>".$Q['reponse']."</label></br>";
     }
   }
  echo"</br></br>";
  echo"<input type='submit' name='ok' value='Valider' />";
  echo "</form>";
 }
 ?>
	</body>
</html>


NB : j'ai codé de tête...il peut y avoir quelques erreurs.. mais le principe est là.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 mai 2017 à 17:28
Merci de votre réponse.

Donc j'ai corriger une petite erreur, mais il m'en reste une au niveau du traitement de la réponse mais je sais pas d’où cela vient.

Voici le code erreur :

Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ': '2'' à la ligne 3 Les datas : Array ( [0] => 2 )

Donc ça dois venir de la requête de traitement de la condition car même sans choisir une réponse.

Mais vraiment quand je code comme vous, il y a des choses que je comprend pas, et je me sens comme avant quand je commencer a coder.....

Voila le code qui affiche sans erreur mais si on valide erreur :

<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');


//connexion à la BDD
require_once ('cobdd.php');

//récupération PROPRE des variables AVANT de les utiliser
$rep_user = !empty($_POST['reponse']) ? $_POST['reponse'] : NULL;
$id_q = !empty($_POST['id_q']) ? $_POST['id_q'] : NULL;

//-------------------------------------------------------------------//
// récupération de la liste des questions et des réponses 
//-------------------------------------------------------------------//
 //préparation de la requête et des variables
 
 //si c'est après l'envoi du formulaire et qu'il y a un id de question :
 $strwhere = "";
 $datas = NULL;
 if($id_q){
   $strwhere = " WHERE id : ? ";
   $datas = array($id_q);
 }
 
 $sql = "SELECT * 
         FROM questions
         $strwhere ";


  //Execution de la requete
  try{
    $requete = $bdd->prepare($sql) ;
    $requete->execute($datas) ;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }
  
  //on transorme le resultat de la requete en array
  $a_result = $requete->fetchAll();
  
  //on compte le nombre de questions :
  $nbr = count($a_result);

  // id de la question si envoyée dans le formulaire.. sinon aléatoire
  $id_question = $id_q ? $id_q : mt_rand(1, $nbr);

  //on récupère la question dans l'array
  $question = !empty($a_result) ? $a_result[$id_question-1] : NULL; 

  if(!empty($question)){
   //préparation de la requête et des variables
   $sql = "SELECT * FROM reponse WHERE id_question = ?";
   $datas = array($question['id']);

    //Execution de la requete
    try{
      $requete = $bdd->prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    
    //on stocke les réponse dans un array
    $reponses = $requete->fetchAll();
    //on randomize les réponses:
    if(!empty($reponses)){
     shuffle($reponses);
    }

  }
   
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
if($rep_user && !empty($reponses))	{
	$verif_rep = $reponses[$rep_user];
	
	if($verif_rep == 1){
		echo "Bravo bonne réponse !</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}else{
		echo "Mauvaise réponse</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}
	
}

?>

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <?php
 if(!$id_q && !empty($question)){
   echo "<h3>".$question['question']."</h3>
       <form method='POST' action=''>
       <!-- champ caché contenant l'id de la question aléatoire -->
       <input type='hidden' name='id_q' value='".$id_question."'>";
   if(!empty($reponses)){   
     foreach($reponses as $Q){
       echo "<input type='radio' id='".$Q['id']."' name='reponse' value='".$Q['id']."'/> 
             <label for='".$Q['id']."'>".$Q['reponse']."</label></br>";
     }
   }
  echo"</br></br>";
  echo"<input type='submit' name='ok' value='Valider' />";
  echo "</form>";
 }
 ?>
	</body>
</html>
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
16 mai 2017 à 18:07
 //si c'est après l'envoi du formulaire et qu'il y a un id de question :
 $strwhere = "";
 $datas = NULL;
 if($id_q){
   $strwhere = " WHERE id : ? ";
   $datas = array($id_q);
 }
 


A remplacer par :
 //si c'est après l'envoi du formulaire et qu'il y a un id de question :
 $strwhere = "";
 $datas = NULL;
 if($id_q){
   $strwhere = " WHERE id = ? ";
   $datas = array($id_q);
 }
 
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 mai 2017 à 19:04
Ce problème est régler mais la encore pour afficher le résultat bonne réponse ou faux j'ai un code erreur : Notice: Undefined offset: 1 in C:\wamp64\www\quizz\index1.php on line 53

Donc on dirai que il arrive pas a récupérè ce qu'il y a dans la base de donne....
Bon je cherche mais si je modifie on vas repartir sur mes pratique douteuse mdr....
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
16 mai 2017 à 19:26
Tu peux faire un print_r de a_result
et un echo de $question et me dire ce que ça t'affiche ?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 mai 2017 à 20:50
( ! ) Notice: Undefined offset: 2 in C:\wamp64\www\quizz\index1.php on line 54
Call Stack
# Time Memory Function Location
1 0.0005 378008 {main}( ) ...\index1.php:0
Array ( [0] => Array ( [id] => 3 [question] => Dans quel année les Sims 4 sont sortie officiellement ? ) )

Voila en validant la question avec l'erreur.

Sans valider j'ai ceci:
Array ( [0] => Array ( [id] => 1 [question] => Combien est a t'il de couleurs primaire ? ) [1] => Array ( [id] => 2 [question] => Quel est la couleur de l'eau ? ) [2] => Array ( [id] => 3 [question] => Dans quel année les Sims 4 sont sortie officiellement ? ) )
( ! ) Notice: Array to string conversion in C:\wamp64\www\quizz\index1.php on line 56
Call Stack
# Time Memory Function Location
1 0.0006 375352 {main}( ) ...\index1.php:0
Array
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
16 mai 2017 à 22:35
Arf.. c'est de ma faute...
c'est le problème quand on code de tête et qu'on ne teste pas...

Essaye ça :
<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

function debug($var,$title=NULL){
 echo "<pre>";
 if($title){
  echo "<b><u>".$title."</b></u>:<br>";;
 }
 if(is_array($var)){
  print_r($var);
 }else{
  echo $var;
 }
 echo "</pre>";
}

//connexion à la BDD
require_once ('cobdd.php');

//récupération PROPRE des variables AVANT de les utiliser
$rep_user = !empty($_POST['reponse']) ? $_POST['reponse'] : NULL;
$id_q = !empty($_POST['id_q']) ? $_POST['id_q'] : NULL;

//-------------------------------------------------------------------//
// récupération de la liste des questions et des réponses 
//-------------------------------------------------------------------//
 //préparation de la requête et des variables
 
 //si c'est après l'envoi du formulaire et qu'il y a un id de question :
 $strwhere = "";
 $datas = NULL;
 if($id_q){
   $strwhere = " WHERE id = ? ";
   $datas = array($id_q);
 }
 
 $sql = "SELECT * 
         FROM questions
         $strwhere ";

  debug($sql,"requete sql");
  debug($datas,"datas");
  //Execution de la requete
  try{
    $requete = $bdd->prepare($sql) ;
    $requete->execute($datas) ;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }
  
  //on transorme le resultat de la requete en array
  $a_result = $requete->fetchAll();
  //On retravaille l'array
  $a_questions = array();
  if(!empty($a_result)){
    foreach ($a_result as $R){
      $a_questions[$R['id']] = $R;
    }
  }
  
  debug($a_questions,"a_questions");
  
  //on compte le nombre de questions :
  $nbr = count($a_questions);

  // id de la question si envoyée dans le formulaire.. sinon aléatoire
  $id_question = $id_q ? $id_q : mt_rand(1, $nbr);
  debug($id_question,"id_question");
  
  //on récupère la question dans l'array
  $question = !empty($a_questions) ? $a_questions[$id_question] : NULL; 
  debug($question,"question");
  
  if(!empty($question)){
   //préparation de la requête et des variables
   $sql = "SELECT * FROM reponse WHERE id_question = ?";
   $datas = array($id_question);
   debug($sql,"requete sql");
   debug($datas,"datas");
   
    //Execution de la requete
    try{
      $requete = $bdd->prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    
    //on stocke les réponse dans un array
    $reponses = $requete->fetchAll();
    //on randomize les réponses:
    if(!empty($reponses)){
     shuffle($reponses);
    }
    debug($reponses,"reponses");
  }
   
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
if($rep_user && !empty($reponses))	{
	$verif_rep = $reponses[$rep_user];
	
	if($verif_rep == 1){
		echo "Bravo bonne réponse !</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}else{
		echo "Mauvaise réponse</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}
	
}

?>

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <?php
 if(!$id_q && !empty($question)){
   echo "<h3>".$question['question']."</h3>
       <form method='POST' action=''>
       <!-- champ caché contenant l'id de la question aléatoire -->
       <input type='hidden' name='id_q' value='".$id_question."'>";
   if(!empty($reponses)){   
     foreach($reponses as $Q){
       echo "<input type='radio' id='".$Q['id']."' name='reponse' value='".$Q['id']."'/> 
             <label for='".$Q['id']."'>".$Q['reponse']."</label></br>";
     }
   }
  echo"</br></br>";
  echo"<input type='submit' name='ok' value='Valider' />";
  echo "</form>";
 }
 ?>
	</body>
</html>


Au passage j'ai ajouté du debug ...
(il te suffira de commenter (ou de supprimer) les lignes si c'est ok )
Sinon.. dis moi ce que ça 't'affiche.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 mai 2017 à 23:37
Merci pour cela, voici le code erreur :

Et tous ce qui s'affiche :
J'ai répondu juste a la question mais sa me dit faux...

requete sql:
SELECT *
FROM questions
WHERE id = ?

datas:
Array
(
[0] => 2
)

a_questions:
Array
(
[2] => Array
(
[id] => 2
[question] => Quel est la couleur de l'eau ?
)

)

id_question:
2

question:
Array
(
[id] => 2
[question] => Quel est la couleur de l'eau ?
)

requete sql:
SELECT * FROM reponse WHERE id_question = ?

datas:
Array
(
[0] => 2
)

reponses:
Array
(
[0] => Array
(
[id] => 5
[reponse] => bleue
[correct] => 1
[id_question] => 2
)

[1] => Array
(
[id] => 6
[reponse] => translucide
[correct] => 0
[id_question] => 2
)

[2] => Array
(
[id] => 7
[reponse] => rouge
[correct] => 0
[id_question] => 2
)

[3] => Array
(
[id] => 8
[reponse] => vert
[correct] => 0
[id_question] => 2
)

)


( ! ) Notice: Undefined offset: 5 in C:\wamp64\www\quizz\index1.php on line 110
Call Stack
# Time Memory Function Location
1 0.0009 384504 {main}( ) ...\index1.php:0
Mauvaise réponse

J'ai répondu bleue, pourtant.
Comme on peu le voir correct = 1 donc réponse vrai.

[0] => Array
(
[id] => 5
[reponse] => bleue
[correct] => 1
[id_question] => 2
)

Pour les autres questions même résultat.... code erreur et réponse fausse.
Quand je répond faux sais la même chose code erreur et réponse fausse.

Comme si le id de ma réponse n'était pas rechercher dans ma base de donnée pour voir si le champs "correct"= 1 .

Voila bonne nuit ;) Et merci encore même si sais loin d'être terminer car après faut que j'apprenne cela si je veux maitriser tous ce que vous utiliser dans ce code.
Car le jour ou je devrai modifier le code si je sais pas le faire sa vas être compliquer pour moi.....
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
16 mai 2017 à 23:45
Ajoutes un
debug($_POST,' --- POST ---  ');


Puis modifie les lignes de code suivantes
 //on stocke les réponse dans un array
    $reponses = $requete->fetchAll();
    //on randomize les réponses:
    if(!empty($reponses)){
     shuffle($reponses);
    }
    debug($reponses,"reponses");
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
if($rep_user && !empty($reponses))	{
	$verif_rep = $reponses[$rep_user];
	
	if($verif_rep == 1){
		echo "Bravo bonne réponse !</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}else{
		echo "Mauvaise réponse</br></br>";
		echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	}
	
}



par
 //on stocke les réponse dans un array
    $reponses = $requete->fetchAll();
    //on randomize les réponses:
    if(!empty($reponses)){
     shuffle($reponses);
     
     $a_rep = array();
     foreach($reponses as $REP){
       $a_rep[$REP['id']] = $REP;
     }
    }
    debug($reponses,"reponses");
    debug($rep_user, "rep_user";
    debug($a_rep[$rep_user], "a_rep[rep_user]");
  //-------------------------------------------------------------------//
  // On vérifie la réponse
  //-------------------------------------------------------------------// 
  if($rep_user && !empty($a_rep))	{
  	$verif_rep = $a_rep[$rep_user]['correct'];
	
	  if($verif_rep == 1){
  		echo "Bravo bonne réponse !</br></br>";
		  echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	  }else{
  		echo "Mauvaise réponse</br></br>";
		  echo "<a href='index.php' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
	  }
  }
0