Signaler

Slectionner 10 questions par jour par uttilisateurs QCM [Résolu]

Posez votre question flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - Dernière réponse le 30 mai 2017 à 09:31 par flo39400
Bonjour,

J'aimerai pouvoir enregistrer dans une table chaque question que un utilisateur a répondu.

De plus l’utilisateur ne doit jamais retombée sur les questions qu'il a déjà répondu

Le seule problème sais que j'ai déjà, sais que enregistre les questions déjà faites, sont enregistrer deux fois dans la base de donnée.

Donc gros problème pour la suite... Surtout que j'ai pas une idée pour la requête SQL pour sélectionner les questions pas rapport a une autre table en fonctionne des questions enregistrer dans la base de donnée.


Voici mon code principal :

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

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

if(!isset($_SESSION['id']))
{
	header('Location: connex.php');
}

//-------------------------------------------------------------------//
// Require de la class et instanciation
//-------------------------------------------------------------------//
require_once ('qcm.class.php');
$oQcm = new qcm($bdd);
if(isset($_GET['go_quiz'])){
//-------------------------------------------------------------------//
//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);


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


// enregistrer informations user
if(isset($id_question))
{
	$id_user = $_SESSION['id'];
	$req_insert_info = $bdd->prepare('INSERT INTO info_user(id_user, question_fait, tempo)VALUES(?, ?, NOW())');
	$req_insert_info->execute(array($id_user, $id_question));
	
}
//-------------------------------------------------------------------//
// recup des réponses de la question
//-------------------------------------------------------------------//
$a_rep = $oQcm->get_reponses_by_id_question($id_question);
echo $id_question;

 
//-------------------------------------------------------------------//
// On vérifie la réponse
//-------------------------------------------------------------------// 
  if($rep_user && $id_q) {
   $verif_rep = $oQcm->check_if_good_answer($rep_user,$id_q);
   
   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(isset($_GET['go_quiz'])){
	 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>";
	 }
 }else{
?>
<a href='index.php?go_quiz=1' rel="nofollow noopener noreferrer" target="_blank">Commencer le quiz du jour !</a>
<?php
}
?>
 </body>
</html>



Merci d'avance de votre aide.


Utile
+0
plus moins
Bonjour,

Comment penses-tu .. qu'une personne voulant t'aider le puisse uniquement avec si peu d'information ....
A savoir que contrairement à ce que tu crois... ton code principale .. c'est celui de ton fichier qcm.class.php (vu que c'est lui qui fait le lien avec la BDD ...)

Code que voici :
<?php
// Fichier : qcm.class.php
class qcm{
 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 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;
  }
  
  /**
  * 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
}
?>



Ensuite ....

Le seule problème sais que j'ai déjà, sais que enregistre les questions déjà faites, sont enregistrer deux fois dans la base de donnée.

Et en français plus compréhensible ça donne quoi ?

Puis ... quelle est la structure de la table dans laquelle tu stockes les réponses de l'utilisateur (ainsi que son nom bien entendu...)

Et enfin... comment identifies-tu l'utilisateur ? Y a t-il une variable de session contenant son ID par exemple ??? (et quelle est la structure de la table des users ?? )



Sachant que pour empecher de tirer une question que l'utilisateur aurait déjà eu.. il suffit de faire un sous select dans un NOT IN
par exemple
  public function get_random_question($id_user){
    $sql = "SELECT * FROM questions 
           WHERE id NOT IN (
              SELECT id_question
              FROM tatabledesreponsesuser
              WHERE id_user = :id_user
             )
           ORDER BY RAND() LIMIT 1";
    $datas = array(':id_user'=>$id_user);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  


Il faudra bien sûr, modifier l'appel à cette fonction en conséquence dans ton code
$a_questions = $id_q ? $oQcm->get_question_by_id($id_q) : $oQcm->get_random_question($id_user);



Pour ce qui est de la limite de 10 par jour .. il faudra ajouter une fonction dans ta class du genre
  /**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : date('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM tatabledesreponsesuser
            WHERE id_user = :id_user
              AND date_rep = :now ";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }


et dans ton code ... AVANT d'afficher la question .. tu fais un IF sur cette fonction pour savoir si oui ou non tu dois lui afficher la prochaine question.


Pour terminer... pour enregistrer....
Il faudra, là encore, faire une fonction dans le fichier qcm.class.php ... fonction qui fera une requête INSERT.
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 09:25
Bonjour, merci de ton aide.

Donc j'ai modifier la class le problème sais qu'il me donne un code erreur.

Comme quoi ma variable id_user n'est pas définie, pourtant j'ai essayer de la mettre dans le fichier qcm.class.php avec un
$id_user = $_SESSION['id'];
.

J'ai essayer aussi de définir la variable directement dans index.php en début du document mais toujours la même erreur il me dit dans
$id_user
n'est pas définit.

Après au niveau de ma table ou il y a les informations sur si l’utilisateur a fait cette question ou pas, la table ce nomme "info_user" il y a les champs suivant id, id_user, question_fait et tempo ( qui enregistre la date et l'heur, en type DATETIME).

Voici le code que j'ai 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;
  }
  /**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : date('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM info_user
            WHERE id_user = :id_user
              AND date_rep = :now ";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }
  /**
  * Récupère une question aléatoire (directement en sql )
  */
  public function get_random_question(){
	$sql = "SELECT * FROM questions 
           WHERE id NOT IN (
              SELECT question_fait
              FROM info_user
              WHERE id_user = :id_user
             )
           ORDER BY RAND() LIMIT 1";
		$datas = array(':id_user'=>$id_user);
		$result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * 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;
  }
  
  /**
  * 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
}

?>



Faut vraiment que je m'entraine sur les class et la structure car vraiment je suis totalement larguer....
Bon je vais essayer autre chose pour définir ma variable id_user.
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 09:53
Re, bon sa a l'aire de fonctionner, faut juste que je corrige mon INSERT pour les questions faites.

Car sa enregistre deux fois.....

Je vais tester avec 10 questions je devrai crée un formulaire car ajouter ça depuis la base de donnée a chaque fois sais lourd.

Voici le code de la page index.php

<?php
session_start();
//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');

// on oblige l’utilisateur a ce connecter 
if(!isset($_SESSION['id']))
{
	header('Location: connex.php');
}
// définir la variable $id_user

$id_user = $_SESSION['id'];

//-------------------------------------------------------------------//
// Require de la class et instanciation
//-------------------------------------------------------------------//
require_once ('qcm.class.php');
$oQcm = new qcm($bdd);
if(isset($_GET['go_quiz'])){
//-------------------------------------------------------------------//
//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_user);
//debug($a_questions,'a_questions');

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

// enregistrer informations user
if(isset($id_question))
{
	$id_user = $_SESSION['id'];
	$req_insert_info = $bdd->prepare('INSERT INTO info_user(id_user, question_fait, tempo)VALUES(?, ?, NOW())');
	$req_insert_info->execute(array($id_user, $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?go_quiz=1' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
   }else{
    echo "Mauvaise réponse</br></br>";
    echo "<a href='index.php?go_quiz=1' 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(isset($_SESSION['id']))
{

?>
<a href="deco.php" rel="nofollow noopener noreferrer" target="_blank">Se déconnecter</a></br></br>
 <?php
}
 if(isset($_GET['go_quiz'])){
	 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>";
	 }
 }else{
?>
<a href='index.php?go_quiz=1' rel="nofollow noopener noreferrer" target="_blank">Commencer le quiz du jour !</a>
<?php
}
?>
 </body>
</html>
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 11:18
Et j'arrive pas a utiliser la fonction pour compter le nombre de questions faites....

Voici la fonction en question :

  /**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : tempo('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM info_user
            WHERE id_user = :id_user
              AND tempo = :now ";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }


J'ai modifier avec tempo car dans ma table j'avais tempo pour DATETIME.

Je sais pas si j'ai bien fait...
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Plusieurs soucis ....

Pourquoi avoir mis ton code d'insertion en BDD dans ton fichier principale ... au lieu de l'avoir mis ( comme le reste du code et comme je te l'avais indiqué ....) dans la CLASS ?? (en respectant la même syntaxe ..!! )

Ensuite.. normal que ça le fasse deux fois ... il faudrait déclencher ce "save" uniquement si l'utilisateur a répondu .. donc dans le if
if($rep_user && $id_q) {


Tu devrais également sauvegarder la réponse de l'utilisateur ( l'id réponse uniquement) ... car sinon ... comment pourras tu retrouver l'info concernant les bonnes réponses ou non de ton user ?? )

Pour finir, pour ce qui est de la fonction pour compter.. c'est normal.
Tu as mis un champ datetime ... hors toi tu veux compter à la journée.
Il faut donc, dans ta requête, faire un format de la date pour ne prendre que la date du jour et pas la date + l'heure..
Pour ça il existe en sql la fonction DATE_FORMAT
https://www.w3schools.com/sql/func_date_format.asp

donc un truc du genre :
 /**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : tempo('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM info_user
            WHERE id_user = :id_user
              AND  DATE_FORMAT(tempo,'%Y-%m-%d') = :now 
             GROUP BY id_user";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }



NB1 : Pour les variables de session .. c'est comme pour les variables POST ou GET .... il faut les récupérer PROPREMENT AVANT de les utiliser

flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 14:34
J'ai modifier car en réalité j'ai fait une modification qui été fausse :

Voila le bon code :

 
/**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : date('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM info_user
            WHERE id_user = :id_user
              AND  DATE_FORMAT(tempo,'%Y-%m-%d') = :now 
             GROUP BY id_user";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->queryExec($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 16:54
Mon Insert ne fonctionne pas je sais pas pourquoi et j'ai aucune erreur....

Voici la ligne qui effectue normalement l'action:


 if($rep_user && $id_q) {
 $a_compte = $oQcm->get_nb_rep_user($id_user);
}


Merci de votre aide.
Répondre
jordane45 18932Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 23 novembre 2017 Dernière intervention - 20 mai 2017 à 18:37
La fonction get_nb_re_user ... ne fait pas d'insertion dans la BDD .... comme son nom l'indique ...(et le code posté avant le montre) ... elle sert à
GET = avoir / Obtenir
NB : Nombre
REP : Réponses
USER: Utilisateur ....

Comme je l'ai indiqué dans ma première réponse:
Pour terminer... pour enregistrer....
Il faudra, là encore, faire une fonction dans le fichier qcm.class.php ... fonction qui fera une requête INSERT.

Fonction que tu pourras nommer par exemple : save_question_user_info

Fonction à laquelle tu devras passer en paramètres : l'id de la question , l'id de la question, (et j'ajouterai : l'id de la réponse .. à condition que dans ta table tu prévois une colonne pour ça. )
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 20 mai 2017 à 19:57
Pour id de la réponse avec aussi une valeurs de point, je pensez crée une table par exemple: classement_points.

Mais bon déjà je doit faire fonctionner mon INSERT.... :/

Je vais modifier cela mais il est vrai que je suis bien perdu car déjà mon affection de NOW() je sais même pas si elle est bonne.

Je vais modifier et modifier, en même temps je fait un formulaire pour ajouter les questions et réponses mais bon la requette SQL je bloque car envoyer en même temps la question et récupere dans un même temps son id afin de l'enregistrer dans la table reponse. Donc je bloque aussi mais bon a force de tester je vais y arriver.
J'ai fait en mode propre avec
$question = !empty($_POST['question']) ? $_POST['question'] : NULL;
$r1 = !empty($_POST['r1']) ? $_POST['r1'] : NULL;
	$r2 = !empty($_POST['r2']) ? $_POST['r2'] : NULL;
	$r3 = !empty($_POST['r3']) ? $_POST['r3'] : NULL;
	$r4 = !empty($_POST['r4']) ? $_POST['r4'] : NULL;


Et pour la condition de savoir si tous les champs sont rempli j'ai utiliser une nouvelle approche je sais pas si cela est bon.

if(($r1 == NULL) OR ($r2 == NULL) OR ($r3 == NULL) OR ($r4 == NULL) OR ($question == NULL)) { echo "Tous les champs ne sont pas rempli !"; 
}else{ 
// on enregistre la question dans la BDD
$sql = "INSERT INTO questions FROM question =:question";
		$data = array(":question"=>$question);
		$requete = $bdd->prepare($sql);
		$requete->execute($data);
}



Donc ici la bloquer donc je retourne sur mon INSERT avec la fonction....

Merci d'avance.
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention jordane45 - 20 mai 2017 à 20:53
Donc j'arrive pas a récupérer mon $id_question, mon id_user je l'est récupéré et j'ai une erreur sur NOW().

Code erreur :
Fatal error: Uncaught Error: Call to undefined function NOW() in C:\wamp64\www\quizz\qcm.class.php on line 67
Notice: Undefined variable: id_question in C:\wamp64\www\quizz\qcm.class.php on line 67

Voici les lignes concerner :

 /**
	*	Enregistrement dans la base de données des questiones faites
	*/ 
	  public function save_question_user_info($rep_user,$id_q) {
	  $id_user  = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
	  $sql = "INSERT INTO info_user(id_user =:id_user, question_fait =:question_fait, tempo =: tempo)";
	  $datas = array(":id_user"=>$id_user,":question_fait"=>$id_question,":tempo"=>NOW());
	  $result = $this->queryExec($sql,$datas);
	  return !empty($result) ? $result[0]['NB'] : 0;
  } 


Vraiment compliquer comme cela....


Merci d'avance de votre aide.
Répondre
Donnez votre avis
Utile
+0
plus moins
Traitons les choses dans l'ordre ...
Avant de passer à ton formulaire de création de questions / réponses .. terminons déjà celui sur lequel tu étais !
Ca ne sert à rien de partir dans plusieurs directions en même temps !!!


... pour ce qui est de "sauver" les réponses du user
- Si ton paramètre est $id_q ... pourquoi dans le reste de ta fonction as tu mis : $id_question ....

- Pourquoi avoir laissé le return sachant que tu fais une requête INSERT .. et que par conséquent.. elle ne retournera jamais de variable['NB']
 return !empty($result) ? $result[0]['NB'] : 0;


- On ne récupère par les variables POST / GET / SESSION dans les class ... tu le fais déjà en amont dans ton fichier principal .. il suffit alors de les passer en paramètres de tes fonctions.

- Tu avais un espace en trop entre le ":" et le mot tempo
 : tempo 


- La fonction NOW() n'existe pas en PHP ... mais en mysql.
En php il aurait fallut faire comme dans mon exemple précédent :
$nom = date('Y-m-d H:i:s');



Bref ... un paquet d'erreurs ... (dont certaines pourraient être facile à éviter .. (ou à corriger par toi même ) à condition de te relire et, le cas échéant de chercher le message d'erreur sur le net ).


Tout ça pour en arriver au code qui t’intéresse ... qui devrait ressembler à un truc du genre :
/**
*	Enregistrement dans la base de données des questiones faites
*/ 
public function save_question_user_info($id_question,$id_user) {
    $sql = "INSERT INTO info_user(id_user,question_fait,tempo) VALUES(:id_user , :id_question , NOW())";
    $datas = array(":id_user"=>$id_user,":id_question"=>$id_question);
    return $this->queryExec($sql,$datas); 
} 



et donc.. cette fonction attend deux paramètres qui sont l'id_user et l'id_question.
Pour l'appeller depuis ton script principal tu feras donc :
//-------------------------------------------------------------------//
// On vérifie la réponse
// ET on sauvegarde en bdd la question répondue par le user
//-------------------------------------------------------------------// 
  if($rep_user && $id_q) {
   $verif_rep = $oQcm->check_if_good_answer($rep_user,$id_q);
   
    $save = $oQcm->save_question_user_info($id_question,$id_user);
    
   //debug($verif_rep,'verif_rep'); 
   if($verif_rep){
	
    echo "Bravo bonne réponse !</br></br>";
    echo "<a href='index.php?go_quiz=1' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
   }else{
    echo "Mauvaise réponse</br></br>";
    echo "<a href='index.php?go_quiz=1' rel="nofollow noopener noreferrer" target="_blank">Retour</a>";
   }
  }




Pour ton autre point ( qui necessiterait une discussion à part au lieu de tout mettre dans le même sujet sur le forum.... )

la requette SQL je bloque car envoyer en même temps la question et récupere dans un même temps son id afin de l'enregistrer dans la table repons

il faut que tu te serves du lastInsertId
http://php.net/manual/fr/pdo.lastinsertid.php


Comme tu vas, vu nos précédents échanges, créer d'autres CLASS pour ton site ... il va falloir refactoriser un peu ton code.

Je te propose de créer un fichier nommer bdd.class.php
ce fichier contiendra le code :
<?php
// Fichier : bdd.class.php
class bdd{
 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 de type SELECT
  * $sql @string : requete sql
  * $datas @array (par défaut = NULL) : array des paramètres de la requete
  * return @array si la variable $fetch = true
  */
  private function querySelect($sql,$datas=NULL){
    $result = NULL;
    try{
      $requete = $this->bdd->prepare($sql) ;
      $requete->execute($datas) ;
      $result = $requete->fetchAll();
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    return $result;
  }
  
   /**
    * Permet d'executer une requete
    * $sql @string : requete sql
    * $datas @array (par défaut = NULL) : array des paramètres de la requete
    * @lastInsertId : (par défaut = true ) sert à indiquer si tu veux ou non l'id autoincrementé généré lors de l'insert 
    * Si la requête est un DELETE ou un UPDATE il faut mettre le parametre lastInsertId à false.
   */
    private function queryExec($sql,$datas=NULL,$lastInsertId=true){
    $result = NULL;
    try{
      $requete = $this->bdd->prepare($sql) ;
      $requete->execute($datas) ;
      $result = $lastInsertId ? $this->bdd->lastInsertId() : NULL;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    return $result;
  }
  
  
 //fin de la class 
}


Je te propose de changer le code de ta class en remplaçant les actuels queryExec par des querySelect lorsqu'il s'agit de requêtes de type SELECT

Comme ceci :
<?php
// Fichier : qcm.class.php
class qcm extends bdd{
 
 /**
 * Constructeur de la class.
 * On lui passe l'objet $bdd en paramètre
 */
 function __construct($oBdd = NULL){
    // on appel le constructeur de la class parent
      parent::__construct($oBdd);
  }
  

  /**
*	Enregistrement dans la base de données des questiones faites
*/ 
public function save_question_user_info($rep_user,$id_question,$id_user) {
    $sql = "INSERT INTO info_user(id_user,question_fait,tempo) VALUES(:id_user , :id_question , NOW())";
    $datas = array(":id_user"=>$id_user,":id_question"=>$id_question);
    return $this->querySelect($sql,$datas); 
} 
  /**
  * 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->querySelect($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->querySelect($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  /**
  * Compte le nombre de questions d'un user en fonction de la date
  */
  public function get_nb_rep_user($id_user,$date = NULL){
    $now = $date ? $date : date('Y-m-d');
    $sql = "SELECT COUNT(id) AS NB 
            FROM info_user
            WHERE id_user = :id_user
              AND date_rep = :now ";
    $datas = array(':id_user'=>$id_user,':now'=>$now);
    $result = $this->querySelect($sql,$datas);
    return !empty($result) ? $result[0]['NB'] : 0;
  }
  /**
  * Récupère une question aléatoire (directement en sql )
  */
  public function get_random_question(){
	$sql = "SELECT * FROM questions 
           WHERE id NOT IN (
              SELECT question_fait
              FROM info_user
              WHERE id_user = :id_user
             )
           ORDER BY RAND() LIMIT 1";
		$datas = array(':id_user'=>$id_user);
		$result = $this->querySelect($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }
  
  /**
  * 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->querySelect($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;
  }
  
  
  /**
  *	Enregistrement dans la base de données des questiones faites
  * retourne l'id auto-incrementé lors de l'insertion en bdd
  */ 
  public function save_question_user_info($id_question,$id_user) {
      $sql = "INSERT INTO info_user(id_user,question_fait,tempo) VALUES(:id_user , :id_question , NOW())";
      $datas = array(":id_user"=>$id_user,":id_question"=>$id_question);
      return $this->queryExec($sql,$datas); 
  }
  
  
//fin de la class
}

?>



Il faudra également dans ton code principal .. faire un require du fichier bdd.class.php

//-------------------------------------------------------------------//
// Require des  class et instanciation
//-------------------------------------------------------------------//
require_once ('bdd.class.php');
require_once ('qcm.class.php');

$oQcm = new qcm($bdd);




flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 21 mai 2017 à 12:52
Bonjour, voila j'ai modifier les fichiers mais j'ai une apparition d'erreur, afin d'isoler les erreurs principal j'ai mis en commentaire la fonction save_question_user_info.

Donc voila le bout de code concerner je sais pas ce que cela veux dire :

  /**
  * Récupère une question aléatoire (directement en sql )
  */
  public function get_random_question(){
	$id_user  = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
	$sql = "SELECT * FROM questions 
           WHERE id NOT IN (
              SELECT question_fait
              FROM info_user
              WHERE id_user = :id_user
             )
           ORDER BY RAND() LIMIT 1";
		$datas = array(':id_user'=>$id_user);
		$result = $this->querySelect($sql,$datas);
    return !empty($result) ? $result[0] : NULL;
  }



Le code erreur :

( ! ) Fatal error: Uncaught Error: Call to private method bdd::querySelect() from context 'qcm' in C:\wamp64\www\quizz\qcm.class.php on line 69
( ! ) Error: Call to private method bdd::querySelect() from context 'qcm' in C:\wamp64\www\quizz\qcm.class.php on line 69


Voila voila, puis je vais chercher sur internet si je peu trouver pourquoi il y a cette erreur si je peu trouver quelque choses qui explique ce comportement.

Merci d'avance.
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonsoir,

Donc j'ai beaucoup chercher les class et fonction sais trop dur pour moi donc a mon avis je vais faire comme j'ai l'habitude de faire....
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Bon je suis toujours bloquer au même endroit j'ai beau modifier des truc toujours la même erreur :( .


..................................................................Help ---> .........
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 29 mai 2017 à 20:39
Bas oui sauf que j'ai un endroit ou ça marcher pas, donc je risque d'avoir un problème vers la fin......
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 29 mai 2017 à 21:04
Re le code ne marche pas, car il devais éviter que l'user 1 ne devais tombée sur les même questions.
Mais j'ai pu d'erreur et tous est enregistrer dans ma table.

J'ai les même questions qui apparaissent plusieurs fois.

Je vais regarder si ID enregistrer et bien celle de la question poser.

Le code modifier :

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

if(!isset($_SESSION['id']))
{
	header('Location: connex.php');
}

$id_user  = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
/*
$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();
*/
$req_questions = $bdd->prepare("SELECT * FROM questions WHERE id NOT IN (SELECT question_fait FROM info_user WHERE id_user = :id_user) ORDER BY RAND()");
$req_questions->execute(array(":id_user"=>$id_user));
$Q = $req_questions->fetch();

$id_question = $Q['id'];


$req_reponse = $bdd->prepare('SELECT * FROM reponse WHERE id_question = ? ORDER BY RAND()');
$req_reponse->execute(array($id_question));

$verification_succee = $bdd->prepare('SELECT * FROM reponse WHERE id = ?');

$req_q_fait = $bdd->prepare('INSERT INTO info_user(id_user,question_fait,point,tempo) VALUES(:id_user , :id_question , :point, NOW())');

?>


<!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['ok']))
{
	$r = $req_reponse->fetch();
	if($_POST['reponse'])
	{
		$verification_succee->execute(array($_POST['reponse']));
		$V_S = $verification_succee->fetch();
			if($V_S['correct'] == !NULL)
			{
				$point = 1;
				$req_q_fait->execute(array(":id_user"=>$id_user,":id_question"=>$id_question,":point"=>$point));
				echo "Bravo bonne réponse !";
			}
			else
			{
				$point = 0;
				$req_q_fait->execute(array(":id_user"=>$id_user,":id_question"=>$id_question,":point"=>$point));
				echo "Mauvaise réponse !";
			}
	}	
	
}else{	
?>

<h3><?= $Q['question'] ?></h3>
<?php
while($r = $req_reponse->fetch()){
?>
<form method="POST">
	<input type="radio" id="<?= $r['id'] ?>" name="reponse" value="<?= $r['id'] ?>" /> <label for="<?= $r['id'] ?>"><?= $r['reponse'] ?></label></br>
<?php
}
?>
</br></br>
	<input type="submit" name="ok" value="Valider" />
</form>
<?php
	}
?>

</body>
</html>


Donc j'ai un beug dans le code ou j'ai quelque choses qui fonctionne mal.....
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 29 mai 2017 à 21:18
Donc la variable $id_question change a la validation alors que j'en n'est besoin.... comment faire pour sauvegarder temporairement la variable et l’utiliser au moment voulu ?
Répondre
jordane45 18932Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 23 novembre 2017 Dernière intervention - 29 mai 2017 à 22:41
Comme dans le code que je t'avais donné précédemment ... en utilisant un input hidden pour y mettre l'id de la question et la renvoyer en POST lorsque tu "submit" le formulaire.

Que tu veuilles le faire à ta façon... .ok ....... mais ça n’empêche pas de relire le code que je t'avais donné pour t'en inspirer !
Je ne vais pas tout te recoder ni tout te réexpliquer sous prétexte que tu as choisi une autre voie au lieu d'essayer de comprendre la solution la plus "propre".

Perso j'arrête de suivre cette discussion.
Si tu veux reposer une question ... met cette discussion en RESOLU et ouvre un autre sujet (en expliquant clairement le souci rencontré et le code utilisé.... et sans oublié qu'on ne pose qu' UNE SEULE question par discussion pour facilité la recherche sur le forum. Merci. )
Répondre
flo39400 557Messages postés mardi 8 avril 2008Date d'inscription 9 novembre 2017 Dernière intervention - 29 mai 2017 à 22:46
Ok... bonne soirée... merci quand même....
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour, donc voila j'ai terminer, merci a ceux qui m'ont aider....

Je vous laisse le code quand même si cela peu aider une personne, un jour, ....

Donc il affiche 10 questions par jour par utilisateur et comptabilise les points par bonne réponses ou mauvaise.

Une bonne réponse +1 point, une mauvaise +0.
J'ai utiliser 4 tables pour faire cela, je vais les nommer :
info_user
/
questions
/
reponse
/
user
.

Voici le code final :

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

if(!isset($_SESSION['id']))
{
 header('Location: connex.php');
}

$id_user  = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;




$req_questions = $bdd->prepare("SELECT * FROM questions WHERE id NOT IN (SELECT question_fait FROM info_user WHERE id_user = :id_user) ORDER BY RAND()");
$req_questions->execute(array(":id_user"=>$id_user));
$Q = $req_questions->fetch();
$reste_Q = $req_questions->rowCount();

$id_question = $Q['id'];


$req_reponse = $bdd->prepare('SELECT * FROM reponse WHERE id_question = ? ORDER BY RAND()');
$req_reponse->execute(array($id_question));

$verification_succee = $bdd->prepare('SELECT * FROM reponse WHERE id = ?');

$req_q_fait = $bdd->prepare('INSERT INTO info_user(id_user,question_fait,point,tempo) VALUES(:id_user , :id_question , :point, NOW())');

$req_nbr_point = $bdd->prepare('SELECT SUM(point) AS total_point FROM info_user WHERE id_user = ?');
$req_nbr_point->execute(array($id_user));
$nbr_point = $req_nbr_point->fetch();


$now = date('Y-m-d');
$req_nbr_question = $bdd->prepare("SELECT COUNT(id) AS NB FROM info_user WHERE id_user = :id_user AND tempo = :now ");
$req_nbr_question->execute(array(":id_user"=>$id_user,":now"=>$now));
$Q_aujourdhui = $req_nbr_question->fetch();
$Q_A = $Q_aujourdhui['NB'];
?>


<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Page Quiz</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
<b>Bienvenue <?= $_SESSION['pseudo'] ?></b></br>

Vous avez un total de :  <i><?php if($nbr_point['total_point'] != 0) { echo $nbr_point['total_point'].' point'; if($nbr_point['total_point'] > 1) { echo 's'; } }else{ echo 'Aucun point !'; }?> </i></br></br></br></br>
<?php 
 
if(isset($_POST['ok']))
{
 $r = $req_reponse->fetch();
 if($_POST['reponse'])
 {
  $verification_succee->execute(array($_POST['reponse']));
  $V_S = $verification_succee->fetch();
   if($V_S['correct'] == !NULL)
   {
    $point = 1;
    $req_q_fait->execute(array(":id_user"=>$id_user,":id_question"=>$_POST['id_question'],":point"=>$point));
    echo "Bravo bonne réponse !";
    header("Refresh: 2; URL=index.php" );
   }
   else
   {
    $point = 0;
    $req_q_fait->execute(array(":id_user"=>$id_user,":id_question"=>$id_question,":point"=>$point));
    echo "Mauvaise réponse !";
    header("Refresh: 3; URL=index.php" );
   }
 } 
 
}else{ 
if($reste_Q == 0 OR $Q_A == 10)
{
 echo "Vous avez répondu a toutes les questions pour aujourd'hui !";
}
else
{
?>

<h3><?= $Q['question'] ?></h3>
<?php

while($r = $req_reponse->fetch()){
?>
<form method="POST">
 <input type='hidden' name='id_question' value="<?= $Q['id'] ?>">
 <input type="radio" id="<?= $r['id'] ?>" name="reponse" value="<?= $r['id'] ?>" /> <label for="<?= $r['id'] ?>"><?= $r['reponse'] ?></label></br>
<?php
}
?>
</br></br>
 <input type="submit" name="ok" value="Valider" />
</form>
<?php
 }
}
?>

</body>
</html>
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !