QCM enregistrer la question quand elle est vue...

Résolu/Fermé
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - Modifié le 14 oct. 2017 à 21:49
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 16 oct. 2017 à 15:36
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 :)


A voir également:

6 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
14 oct. 2017 à 22:09
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?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 00:07
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.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
15 oct. 2017 à 09:48
donc tout va bien et tu n'as pas de question?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
15 oct. 2017 à 11:41
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...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
15 oct. 2017 à 10:38
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).
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 11:39
J'ai mon id primary auto_increment toujours en tête...
Donc je vais modifier et je vous montre cela...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
15 oct. 2017 à 10:27
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 11:37
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...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
15 oct. 2017 à 10:34
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://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 11:40
Des risques ? Quel risques ?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 11:45
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....
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
15 oct. 2017 à 11:55
Détectes-tu aussi les erreurs dans les requêtes, comme expliqué?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 11:59
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 :)
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
15 oct. 2017 à 12:19
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 13:51
1) ligne 66 elle sert a réceptionner les informations entré par l'utilisateur.
2) Si il fonctionne très bien, il récupère l'ID de la question, et affiche les propositions suivant cette ID, puis dans la table reponse il y a id / id_question / reponse / correct.
Si correct == 1 alors bravo c'est la bonne réponse sinon Mauvaise réponse.

3) Non a l'heure actuel du code afficher il fonctionne a 100% le seule problème comme je l'est dit si je recharge la page il change de question et cela a l'infinie donc après il est facile de faire un sans faute si tu vas chercher sur internet.

Voila voila, bon je vais voir sa dans la journée pour effectuer une condition pour enregistrer les question non répondu.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
15 oct. 2017 à 14:12
eh bien, si tu publies l'adresse de ton site, je te montrerai comment tricher facilement.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 14:39
Bas il n'est pas en ligne en faite mais je vais crée une nouvelle table pénalité dès que la question vu par l'user elle est enregistré et dès quel n'est pas dans la table info_user sa enlève des points.... J'aurai plus qu'a comparai les deux....

Oui pour le moment cela est possible mais une fois le problème corriger il est peu probable de tricher vu que je vais mètre un timer en javascript afin de contrôler le temps, et même si cela n'est pas efficace chaque réponse est stocker avec un date time donc pour le classement ce sont les personnes les plus rapide qui serons en tête de liste.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
15 oct. 2017 à 15:03
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 15:56
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%
0

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

Posez votre question
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
15 oct. 2017 à 15:33
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
15 oct. 2017 à 15:54
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 oct. 2017 à 09:41
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.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 16 oct. 2017 à 10:13
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.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
16 oct. 2017 à 15:36
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";
?>

0