QCM enregistrer la question quand elle est vue... [Résolu/Fermé]

Signaler
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
-
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
-
Bonjour,

Voila, j'ai un QCM qui fonctionne mais mon seule problème c'est que quand je recharge la page je voie toutes les questions et les proposition alors faudrai un moyen d'enregistrer la question vu.

Donc j'avais fait des modifications tel que faire un INSERT dès l'apparition de la question et donc j'ai mis ma colonne point en NULL mais cela n'a pas marcher créeation de plusieurs ligne qui reste point en NULL d'autre qui sont mis avec le nombre de point mais très mal fait alors j'aimerai que l'on me donne un conseil afin d'y arriver au mieux.



Voici mon code celui la fonctionne :
Les include top.php et bot.php sont la structure html de base.
coud.php pour ce connecter a la base de donnée.

Le reste est commenter point par point voila.

<?php 
session_start(); //démarrage des sessions
require "SQL/cobdd.php"; // Connection a la base de données 
include "lib/top.php";  // Le début de code HTML et le menu
$id_user  = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL; 
//on récupère id_user
if(isset($_GET['next'])){ // recuperation de la méthode GET ?>
<script type='text/javascript'>
    document.location.replace('quiz.php'); //script JS cela recharge la page

</script>
<?php
}


$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()"); //recuperation de la question de façon aléatoire 
$req_questions->execute(array(":id_user"=>$id_user));
$Q = $req_questions->fetch();
$reste_Q = $req_questions->rowCount();
//on compte la nombre de question
$id_question = $Q['id']; //on crée une variable avec l’ID de la question récupéré 


$req_reponse = $bdd->prepare('SELECT * FROM reponse WHERE id_question = ? ORDER BY RAND()'); //on récupère les réponses avec ID de la question et cela de façon aléatoire aussi
$req_reponse->execute(array($id_question));

$verification_succee = $bdd->prepare('SELECT * FROM reponse WHERE id = ?');
//on vérifier si la réponses sélectionner est bonne


$req_q_fait = $bdd->prepare('INSERT INTO info_user(id_user,question_fait,point,tempo) VALUES(:id_user , :id_question , :point, NOW())'); //on enregistre la réponses de l’utilisateur avec son nombre de point

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


$now = date('Y-m-d'); // formatage de la date
$req_nbr_question = $bdd->prepare("SELECT COUNT(id) AS NB FROM info_user WHERE id_user = :id_user AND tempo = :now "); // on calcule le nombre de questions fait par l'utilisateur par rapport a la date du jour
$req_nbr_question->execute(array(":id_user"=>$id_user,":now"=>$now));
$Q_aujourdhui = $req_nbr_question->fetch();
$Q_A = $Q_aujourdhui['NB']; // création variable qui a le nombre de questions faites aujourd’hui
if(isset($_SESSION['id'])){  //si la variable session ID est présente on continue 
?>

    <p style="margin-top: 5%;padding-left: 30px;">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></p>
    <!-- Affichage du nombre de point de l’utilisateur -->


    <?php 
 }

if(isset($_POST['ok'])) // Si le bouton est cliquer on continue
{
 $r = $req_reponse->fetch();
 if(isset($_POST['reponse'])) // Si il y a une réponse de l’utilisateur
 {
  $verification_succee->execute(array($_POST['reponse']));
  $V_S = $verification_succee->fetch(); 
   if($V_S['correct'] == !NULL) // on vérifie si la réponse est correcte 
   {
    $point = 1;
    $req_q_fait->execute(array(":id_user"=>$id_user, ":id_question"=>$id_question, ":point"=>$point));
    echo "<p style='margin-top: 10%; text-align: center;'>Bravo bonne réponse !<br/>";
    echo "<a href='quiz.php?next=go' rel="nofollow noopener noreferrer" target="_blank">Question suivante</a></p>";
   }
   else
   {
    $point = 0;
   $req_q_fait->execute(array(":id_user"=>$id_user, ":id_question"=>$id_question, ":point"=>$point));
    echo "<p style='margin-top: 10%; text-align: center;'>Mauvaise réponse !<br/>";
     echo "<a href='quiz.php?next=go' rel="nofollow noopener noreferrer" target="_blank">Question suivante</a></p>";
   }
}else{
    echo "<p style='margin-top: 10%; text-align: center;'><a href='quiz.php?next=go' rel="nofollow noopener noreferrer" target="_blank">Question suivante</a></p>";
} 
 
}else{
if($reste_Q == 0 OR $Q_A == 10)
{
 echo "<p style='margin-top: 10%; padding-left: 35%; padding-right: 35%;'>Vous avez répondu a toutes les questions pour aujourd'hui !</p>";
}elseif(!isset($_SESSION['id'])){
    echo "<p style='text-align: center; margin-top: 10%;'>Vous devez être connecter afin de participer au Quiz !</p>";
}
else
{
     $_SESSION['Q_id_c'] = $Q['id'];
?>
    <form method="POST">
        <table class="quiz">

            <caption>Q.C.M</caption>
            <tr class="quiz_tr">
                <td class="quiz_td">Question</td>
                <td class="quiz_td">
                    <h3>
                        <?= $Q['question'] ?>
                    </h3>
                </td>
            </tr>
            <tr class="quiz_tr">
                <td class="quiz_td">Réponses</td>




                <td class="quiz_td">
                    <?php

while($r = $req_reponse->fetch()){
?>

                        <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>
                        <?php
}
?>
                </td>
            </tr>
            <tr class="quiz_tr">
                <td class="quiz_td" colspan="2"><input type="submit" name="ok" value="Valider" /></td>
            </tr>

        </table>
    </form>
    <?php
 }
}

?>

        <?php 

include "lib/bot.php";  // bas de page
?>


Merci a vous :)


6 réponses

Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
bonsoir, ton explication n'est pas très claire.
je comprends que tu fais un INSERT dès l'apparition de la question pour mémoriser les questions à ne plus montrer.
la suite est assez confuse.
tu écris "cela n'a pas marché", sans expliquer ce qui marche et ce qui ne marche pas.
les INSERT fonctionnent-ils bien, l'information est-elle correcte dans la table info_user?
si je comprends bien, tu es surprise que, dans la table info_user, certaines questions ont le point à 1 et d'autres le point à 0. ai-je bien compris?
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Bonsoir, merci de votre réponse.

Donc la code afficher celui fonctionne, mais quand j'ai modifier donc pour savoir quel question sont vu par l'utilisateur. Donc j'ai juste fait un "INSERT INTO info_user WHERE id_user, question_fait" ( cette table a id, id_user, question_fait et point en NULL par défaut). Donc après j'ai modifier la partie ou il y a "Bravo bonne réponse !" et "Mauvaise réponse" j'ai placer un UPDATE info_user..... Et résultat j'avais parfois 3 fois la même ligne seule une seule ligne avec le update qui avait pris résultats en 4 questions j'avais fait les 10 questions qui sont autoriser par jour.

Donc je dois être plus méthodique pour que cela fonctionne correctement.
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

donc tout va bien et tu n'as pas de question?
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18 >
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021

Mais ma question est comment je peu faire pour éviter que les questions qui sont vu sois compté en temps que question faite... afin d'évité toute triche...
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

as-tu créé une clé unique sur la combinaison (id_user, question_fait) dans la table info_user?
cela empêchera d'avoir des doublons (plusieurs fois la même ligne), et t'aidera à détecter rapidement que ton code ne se comporte pas bien (qu'il essaie de créer des doublons).
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
J'ai mon id primary auto_increment toujours en tête...
Donc je vais modifier et je vous montre cela...
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
j'ai peut-être compris ce que tu souhaitais:
le code que tu montres fonctionne bien, mais tu souhaites l'améliorer pour ne pas poser deux fois la même question dans le cas où l'utilisateur n'a pas répondu à la question.
et tu as fais différentes tentatives pour obtenir cela, sans nous montrer le code que tu as essayé, et tu n'es pas content du résultat.
et tu nous demandes des suggestion.
ai-je bien compris?
si oui, je suggère ceci:
- faire le INSERT de $req_q_fait au moment de poser la question, donc après la ligne 105.
- au lieu de faire les INSERT en lignes 74 et 83, faire des UPDATE. une autre possibilité, moins élégante, serait de faire un DELETE avant l'INSERT.
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Si je fait un DELETE cela n'a aucun sens vu que la question sera déjà vu par l'utilisateur donc il pourra retombée dessus tot ou tard...
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
autre chose: j'ai l’impression que tu prends des risques en ne suivant pas les conseils suivants à propos de la gestion des erreurs PDO:
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Des risques ? Quel risques ?
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Car pour me connecter a ma base de données j'ai cela, et j'ai aucune erreur, j'ai juste pas le résultat que j'attend....
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

Détectes-tu aussi les erreurs dans les requêtes, comme expliqué?
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Mais il en n'a pas d'erreur car tous fonctionne sauf que a mon avis pendant le traitement j'ai des requêtes qui doivent s'effectuer plusieurs fois et je comprend pas pourquoi,...

Mais il est vrai que vu que vous avez pas le code avec la condition supplémentaire il est compliqué de vous rendre compte.

Et je vais mètre vos détections d'erreur comme cela, nous serons au top :)
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
1) à quoi sert la ligne 66?
2) quand l'utilisateur donne une réponse, je pense que ton programme ne vérifie pas que c'est une réponse à la dernière question posée à l'utilisateur.
3) quand l'utilisateur donne une réponse, je pense que ton programme fait comme si c'était la réponse à la prochaine question.
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Car ça sais un reste du code précédant... Et il y a aucune anomalie je comprend pas, ce code comme je l'est dit fonctionne a 100%
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

peux-tu marquer le sujet comme résolu?
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Mais il n'est pas résolut vu que quand je recharge la page il change de question sans que il est aucune trace dans la base de données.....
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

je t'ai envoyé un ensemble de suggestions pour améliorer cela, et tu réponds chaque fois que ton code est déjà parfait...
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Non j'ai dis que cela n'a rien n'a voir avec mon problème....
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
il y a un autre problème dans ton code: la page sert soit à poser une question, soit à traiter une réponse.
le code des lignes 16 à 50 contient certaines actions qui doivent être faites dans un seul cas, pas dans les deux.
je te suggère donc de revoir cela, et de déplacer un partie de ce code soit en remplacement de la ligne 66, inutile, soit avant la ligne 105.
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Mais ligne 66 y a rien, et non il y a aucun problème la page pose la question et les proposition puis récupère la réponse. Rien de plus n'y moins, je comprend pas ce que vous chercher ce code marche.
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Voici un code qui illustre mon problème :

<?php
include "lib/top.php";
include "SQL/cobdd.php";
$sql = "SELECT * FROM info WHERE id NOT IN (SELECT id_info FROM action) ORDER BY RAND()";
$view_i_v = $bdd->query($sql);
$v_i_v = $view_i_v->fetch();
$nb_r = $view_i_v->RowCount();
$view = $v_i_v['news'];
$id_info = $v_i_v['id'];
$vu = "1";
if($nb_r != 0){
    $sql2 = "INSERT INTO action(id_info, vu) VALUES(? ,?)";
    $req = $bdd->prepare($sql2);
    $req->execute(array($id_info, $vu));
     
}

if(isset($_POST['ok'])){
    if(!empty($_POST['reponse'])){
        $reponse = htmlspecialchars($_POST['reponse']);
        $up_sql = "UPDATE action SET bouton = ? WHERE id_info = ?";
        $up_req = $bdd->prepare($up_sql);
        $up_req->execute(array($reponse, $id_info));
        echo "ok";
    }
}
?>
    <p>Nous allons crée deux tables une avec des informations qui sont afficher de façon alèatoire.</p>
    <p>Et une autre avec la détection de vu et l'action de l'uttilisateur.</p>

    <?php  
if($nb_r != 0){
    echo $view."<br/>".$id_info;
    ?>

    <form method="post">
        <table>
            <tr>
                <td><label for="oui">Oui</label></td>
                <td><input type="radio" name="reponse" id="oui" value="1" /></td>
            </tr>
            <tr>
                <td><label for="non">Non</label></td>
                <td><input type="radio" name="reponse" id="non" value="2" /></td>
            </tr>
            <tr>
                <td><input type="submit" name="ok" value="ok" /></td>
            </tr>
        </table>
    </form>
    <?php
}else{
    echo "Pu de news ! Vous avez tous lu !";
}

include "lib/bot.php";
?>


Donc pendant le traitement j'ai un décalage de réponse.... Comme sur mon premier code quand je veux savoir si un utilisateur a répondu ou non car en rechargeant la page la ça met la question dans la base de données.
Messages postés
14035
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2021
790
c'est normal, tu as conservé les deux erreurs que je t'ai signalées précédemment en #14:
-) quand l'utilisateur donne une réponse, ton programme ne vérifie pas que c'est une réponse à la dernière question posée à l'utilisateur. cela permet donc de tricher.
-) quand l'utilisateur donne une réponse, ton programme fait comme si c'était la réponse à la prochaine question.

je te rappelle donc ma suggestion en #18:
je pense que tu peux parfaitement te protéger, simplement, en utilisant complètement $_SESSION['Q_id_c']. Tu as fait une partie du travail en l'enregistrant au moment de poser une question, pourquoi ne pas l'exploiter au moment de recevoir une réponse?
Je pense utile de vérifier à ce moment-là que la réponse correspond bien à la question posée, et, si oui, d'utiliser cette question pour mettre à jour la table info_user (sinon, refuser la réponse).
Je pense que cela éliminera l'anomalie principale que tu observes dans la table info_user.

ma suggestion #19 reste utile également.
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
18
Super sais good merci et désoler de ne pas avoir compris cela avant :)

Voici le code modifier :


<?php
session_start();
include "lib/top.php";
include "SQL/cobdd.php";
$sql = "SELECT * FROM info WHERE id NOT IN (SELECT id_info FROM action) ORDER BY RAND()";
$view_i_v = $bdd->query($sql);
$v_i_v = $view_i_v->fetch();
$nb_r = $view_i_v->RowCount();
$view = $v_i_v['news'];
$id_info = $v_i_v['id'];
$_SESSION['id_info'] = $id_info;
$vu = "1";
if($nb_r != 0){
    $sql2 = "INSERT INTO action(id_info, vu) VALUES(? ,?)";
    $req = $bdd->prepare($sql2);
    $req->execute(array($id_info, $vu));
    
}

if(isset($_POST['ok'])){
    if(!empty($_POST['reponse'])){
        $reponse = htmlspecialchars($_POST['reponse']);
        $up_sql = "UPDATE action SET bouton = ? WHERE id_info = ?";
        $up_req = $bdd->prepare($up_sql);
        $up_req->execute(array($reponse, $_SESSION['id_info']));
        
    }
}
?>
    <p>Nous allons crée deux tables une avec des informations qui sont afficher de façon alèatoire.</p>
    <p>Et une autre avec la détection de vu et l'action de l'uttilisateur.</p>

    <?php  
if($nb_r != 0){
    echo $view."<br/>".$id_info;
    ?>

    <form method="post">
        <table>
            <tr>
                <td><label for="oui">Oui</label></td>
                <td><input type="radio" name="reponse" id="oui" value="2" /></td>
            </tr>
            <tr>
                <td><label for="non">Non</label></td>
                <td><input type="radio" name="reponse" id="non" value="3" /></td>
            </tr>
            <tr>
                <td><input type="submit" name="ok" value="ok" /></td>
            </tr>
        </table>
    </form>
    <?php
}else{
    echo "Pu de news ! Vous avez tous lu !";
}

include "lib/bot.php";
?>