IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Lecture et affichage de données [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Lecture et affichage de données
    Bonjour,

    Je souhaite créer un quizz dans lequel l'utilisateur, après s'être connecté, choisie la difficulté et commence. Je débute en programmation. Je suis en train de programmer la partie "quizz". Alors voilà, j'ai une base de données dans laquelle j'ai deux tables : une table nommée "answers", et une autre nommée "questions". Dans la table "answers" se trouvent les champs:"id", "id_question", "answer" ( affiche la réponse), "validate" (soit à 0 soit à 1 pour dire si c'est une bonne ou mauvaise réponse) et dans la table "questions": "id", "question".

    Je souhaite afficher les questions aléatoirement. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
     
    <?php
     
    require_once 'inc/db.php';
     
    require_once 'inc/functions.php';
     
    logged_only();
     
    require 'inc/header.php';
     
    $num_question = 1;
    $vie = 3;
    $score = 0;
     
    // on récupère les informations de la base de données
    $req = $pdo->query('SELECT *
                        FROM answers, questions
                        WHERE answers.id_question = questions.id /* A cette ligne on joint les 2 tables (cf. JOIN) */
                        ORDER BY RAND()
                        LIMIT 0,2');
     
    // on affiche le résultat
     
    $data = array($req->fetch());
     
     
    foreach($data as $answer){
        echo $data->answer;
    }
     
    ?>
    <br><br><br><br>
    <form class="form-horizontal">
        <fieldset>
            <legend><p align="center">Question <?php echo $num_question?></p></legend>
                <div class="form-group">
                    <p><?php echo $data->$num_question; ?></p> <!-- Ici on affiche le champ 'question' qui se trouve dans $data -->
                <div class="col-lg-10">
                    <div class="radio">
                        <label>
                            <input name="optionsRadios" id="optionsRadios1" value="option1" checked="" type="radio">
                            <?php echo $data->$answer; ?>
                        </label>
                    </div>
                    <div class="radio">
                        <label>
                            <input name="optionsRadios" id="optionsRadios2" value="option2" type="radio">
                            <?php echo $data->$answer; ?>
                        </label>
                    </div>
                    <div class="radio">
                        <label>
                            <input name="optionsRadios" id="optionsRadios2" value="option2" type="radio">
                            <?php echo $data->$answer; ?>
                        </label>
                    </div>
                    <div class="radio">
                        <label>
                            <input name="optionsRadios" id="optionsRadios2" value="option2" type="radio">
                            <?php echo $data->$answer; ?>
                        </label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-lg-10 col-lg-offset-2">
                    <button type="submit" class="btn btn-primary">Valider</button>
                    <button type="reset" class="btn btn-default">Passer</button>
                </div>
            </div>
        </fieldset>
    </form>
     
    <?php require 'inc/footer.php'; ?>
    Voici ce qui se passe:

    Nom : Capture.JPG
Affichages : 168
Taille : 15,3 Ko

    Voilà. J'ai conscience que pleins de choses ne vont pas là-dedans mais comme je vous l'ai dit je débute.

    Je ne comprends pas comment afficher toutes les propositions de réponses aux questions. De plus, comment faire si à une question il n'y a que 2 propositions de réponses (comment en afficher que 2 ?).

    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Sysadmin Linux
    Inscrit en
    Mars 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Sysadmin Linux

    Informations forums :
    Inscription : Mars 2017
    Messages : 76
    Par défaut
    foreach($data as $key => $value){
    $answer[$key] = $value;
    }

    $answer[0] (reponse 1)
    $answer[1] (reponse 2)
    ...

    http://php.net/manual/en/control-structures.foreach.php

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Rebonjour !
    J'avais déjà pris connaissance de cette boucle 'foreach', mais franchement et je ne sais pas pourquoi, je n'arrive pas à comprendre comment elle fonctionne. J'ai décidé de ne pas l'utiliser quitte à utiliser une méthode beaucoup moins "belle" . Voici le code que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    <?php
     
    require_once 'inc/db.php';
     
    require_once 'inc/functions.php';
     
    logged_only();
     
    require 'inc/header.php';
     
    $vie = 3;
     
    $num_question = 1;
     
     
    <form method="POST" class="form-horizontal">
        <fieldset>
            <legend><p align="center">Question <?php echo $num_question?></p></legend>
            <div class="form-group">
                <p><?php
     
                    $req = $pdo->query('SELECT * /* Cette requête choisit aléatoirement une question, le "*" est obligatoire pour pouvoir récupérer l\'id  */
                                                FROM questions /* Depuis la table "question" */
                                                ORDER BY RAND() /* ORDER BY RAND() = Sélection aléatoire */
                                                LIMIT 0,1'); /* Avec une limite de 1 question */
     
     
     
     
     
                    while ($data = $req->fetch()) { /* Cette boucle va récupérer les infos dans la req ci-dessus */
     
                        $result_req = $data->id; /* On récupère l'id de la question séléctionnée aléatoirement */
     
                        echo $data->question, '</br>';/* On affiche la question */
     
                        } ?></p>
     
     
     
                <div class="col-lg-10">
                    <div class="radio">
                        <label>
     
                            <?php
     
                            $req2 = $pdo->query("SELECT * /* IDEM mais pour la réponse */
                                                 FROM answers
                                                 WHERE id_question = '$result_req' "); // sélectionne les réponses associées à l'id de la question aléatoire
     
                            while ($data = $req2->fetch()) { ?>
     
                                <input name="optionsRadios" id="optionsRadios1" value="option1" checked="" type="radio"/> <?php echo $data->answer ?> </br>
     
                            <?php
     
                            }
     
                            $req3 = $pdo->query("SELECT *
                                                 FROM answers
                                                 WHERE id_question = '$result_req' AND validate = 1");
     
                            while ($data = $req3->fetch()) {
     
                                $validate = $data->id;
     
                                echo $validate;
     
     
                            if($_POST['optionsRadios'] == $validate){
     
                                $_SESSION['flash']['success'] = "Bonne réponse !";
     
                            }else{
     
                                $_SESSION['flash']['danger'] = "Mauvaise réponse !";
     
                            }
                            }
     
                            ?>
                        </label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-lg-10 col-lg-offset-2">
                    <input type="submit" class="btn btn-primary" value="Valider"/>
                    <input type="reset" class="btn btn-default" value="Passer"/>
                </div>
            </div>
        </fieldset>
    </form>
    Donc cela fonctionne, j'ai la question et les réponses associées, comme le montre ce screen:

    Nom : Capture.JPG
Affichages : 133
Taille : 16,9 Ko

    Le problème, maintenant, est que je ne sais pas comment vérifier si l'utilisateur a sélectionné une bonne réponse ou non. Je pense que le problème se trouve au niveau du $_POST[]. Quelqu'un pourrait m'orienter svp ? Merci beaucoup pour ta réponse emutramp même si je te l'avoue, le foreach, je ne l'ai pas vraiment assimilé

  4. #4
    Membre confirmé
    Homme Profil pro
    Sysadmin Linux
    Inscrit en
    Mars 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Sysadmin Linux

    Informations forums :
    Inscription : Mars 2017
    Messages : 76
    Par défaut
    lu,

    value="option1" remplace par value="<?php echo $data->answer ?>"

    Le bout de code suivant est incorrect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
                            <?php
     
                            }
     
                            $req3 = $pdo->query("SELECT *
                                                 FROM answers
                                                 WHERE id_question = '$result_req' AND validate = 1");
     
                            while ($data = $req3->fetch()) {
     
                                $validate = $data->id;
     
                                echo $validate;
     
     
                            if($_POST['optionsRadios'] == $validate){
     
                                $_SESSION['flash']['success'] = "Bonne réponse !";
     
                            }else{
     
                                $_SESSION['flash']['danger'] = "Mauvaise réponse !";
     
                            }
                            }
     
                            ?>
    Essayes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    <?php
     
        }
                          //Determine si $_POST est set
                         if(isset($_POST['optionsRadios'])) {
     
                           //Dans ta requete SQL, essayes de la modifier pour eviter *, selectionne que le champ de ta reponse (plus opti). De plus, comme tu utilises les doubles quotes, pas besoin d'utiliser les single quote sur les variables.
                           $req3 = $pdo->query("SELECT *
                                                 FROM answers
                                                 WHERE id_question = $result_req AND validate = 1"); // validate = 1 ? Vire and validate = 1 de la requete
     
                           // Ici je pense qu'il y a un prob, ID doit correspondre a la clef index numeric du champ de ta table, non au champ reponse que tu as besoin 
                           $validate = $data->id;
     
                            // === a la place de == pour une comparaison strict, pas besoin de bracket pour if / else si la condition ne renferme qu'une ligne d'instruction
                            if($_POST['optionsRadios'] === $validate) 
     
                                $_SESSION['flash']['success'] = "Bonne réponse !";
     
                            else
     
                                $_SESSION['flash']['danger'] = "Mauvaise réponse !";
                    }
                            ?>
    Pas besoin d'utiliser la boucle while plus que ce que tu en as besoin, while est gourmand en ressource a l'instar de foreach, ces deux fonction se comporte differement toutefois :

    foreach/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $mavariable = "bonjour";
     
    foreach($mavariable as $value) {
                  echo $value; //Ici bonjour sera affiche
    }
    Exemple numero 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $mavariable = ["bonjour", "bonsoir", "demain", "volcan"]; // Array variable 
     
    foreach($mavariable as $value) {
                  echo $value; //Ici bonjour sera affiche en premier
                  echo "<br>"; //J'ajoute un br html comme derniere instruction, et je recommence avec la deuxieme entree de l'array et ainsi de suite...                                   
    }
    while/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    //Assigne le chiffre 0 a la variable $a
    $a = 0;
     
    //Tant que $a est plus petit que 15, on execute la boucle
    while($a < 15) {
     
              //Si $a plus petit que 5, on affiche
              if($a < 5)
                echo "Donne moi plus";
     
              //Ou alors sii $a plus petit que 15 et plus grand que 5, on affiche
              elseif($a < 15 && $a > 5)
                echo "Encore plus";
     
              //Sinon, je suis forcement a 15 et donc suis la derniere interation de la boucle
              else
                echo "Merci";
     
    //Fin d'instruction, je repete les instructions de la boucle tant que celle-ci n'a pas satisfaite ses conditions, que $a soit egal ou plus grand que 15
    //Pour cela. juste avant de reexecuter mes instructions, j'ajoute +1 a la variable $a
    ++$a;
    }
    Et enfin, si tu utilises mySQL et que ton script n'a pas l'intention ou la vocation a etre exportable sur d'autres SGDB, tu pourrais a la place de PDO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $stmt = $mysqli->prepare("SELECT reponse FROM answers WHERE id_question = ?");  //La requete a executer, le ? est utilise pour indiquer l'utilisation d'une variable
    $stmt->bind_param("i", $result_req); //Pour ? de la requete SQL, la variable est : i -  si la variable n'a que pour valeur des chiffres de 0-9  | s - Si la variable result_req contient du texte 
    $stmt->execute(); //Execute la requete
    $stmt->bind_result($reponse); // Je recupere le resultat | Si plusieurs champs, il faut ajouter autant de variable dans, exemple : $stmt->bind_result($reponse,$champ2,$idquestion)
    while ($stmt->fetch()) { // Pour chaque resultat que j'ai a
              $result[] = $reponse; //Ajoute chaque resultats comme une nouvelle entree tableau
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture et affichage de données
    Par haydens dans le forum MATLAB
    Réponses: 9
    Dernier message: 21/12/2009, 16h42
  2. TDBCtrlGrid - Affichage des données
    Par audreyb dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2004, 13h10
  3. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07
  4. Affichage de données (histograme, graphe etc.)
    Par sunshine33 dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 13/01/2004, 14h16
  5. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo