Quiz - Méthodologie

Eléphanteau du PHP | 10 Messages

16 juin 2012, 11:12

Bonjour à tous,

Pour un petit projet je dois réaliser un quiz, mais autant le dire php et moi ça fait 2.
Explication du projet : une dizaine de question, une question par écran. Sur chaque écran l'utilisateur verra si il a bien répondu, la bonne réponse sera affichée le cas échéant et dans tous les cas une petite justification de la réponse, il passera ensuite à la question suivante. Les résultat sont stockés en BDD pour que je puisse ensuite les interpréter.

Voilà ce que j'ai commencé à faire

Code : Tout sélectionner

<?php include ('config.php'); $connect = mysql_connect($sql_host, $sql_user, $sql_password) or die ("Impossible de se connecter à la base de données"); mysql_select_db($sql_database, $connect) or die ("Impossible de sélectionner la base de données".$sql_database); $valid = false; if (isset($_POST['Poster'])) { extract($_POST); if (isset($_POST['question1']) &&($_POST['question1'] == "Rp3")) { $erreur = 'Bonne réponse'; $color = 'green'; $aide1 = '<div class="aide">Explication reponse</strong>.</div>'; $valid = true; } elseif ((isset($_POST['question1'])) && (($_POST['question1'] == "Rp1")) || ((isset($_POST['question1'])) && ($_POST['question1'] == "Rp2")) ) { $erreur = 'Mauvaise réponse, il fallait répondre : '; $color = 'red'; $answer = '<strong>Réponse 3</strong>'; $aide1 = '<div class="aide">Explication reponse</strong>.</div>'; $valid = true; } } if ((isset($_POST['Poster'])) && (!isset($_POST['question1']))) { echo '<span class="red">Au moins une réponse est requise</span>'; $valid = false; } if (($valid = true) && (isset($_POST['question1']))) { $sql = "INSERT INTO resultat (id,questionnb1) VALUE ('','$question1')"; mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); mysql_close(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title></title> <style> body {font-family: trebuchet MS, arial, verdana; font-size: 12px;} .red {color: red;} .green {color: green;} .aide {background: red; color: white; padding: 5px;} </style> </head> <body> <form method="post" action=""> <fieldset> <legend>Question 1 ?</legend> <p><input type="radio" id="Rp1" value="Rp1" name="question1" <?php if (isset($question1) && ($question1 == "Rp1")) echo "checked=checked"; ?>/><label for="Rp1">Réponse 1</label></p> <p><input type="radio" id="Rp2" value="Rp2" name="question1" <?php if (isset($question1) && ($question1 == "Rp2")) echo "checked=checked"; ?>/><label for="Rp2">Réponse 2</label></p> <p><input type="radio" id="Rp3" value="Rp3" name="question1" <?php if (isset($question1) && ($question1 == "Rp3")) echo "checked=checked"; ?>/><label for="Rp3">Réponse 3</label></p> <p><input type="submit" name="Poster" /></p> <p><?php if (isset($erreur)) echo '<span class="'.$color.'">' .$erreur. ' </span>'?><?php if (isset($answer)) echo $answer; ?></p> </fieldset> <?php if (isset($aide1)) echo $aide1; ?> </form> </body> </html>
Jusque là ça fonctionne à peu près comme je le souhaite même si l'écriture du code ne parait bien pompeuse (notamment dans l'écriture des tests). Mais là je reste bloqué sur comment passer à la question suivante puisque je fait mes test après soumission de ma page (le plus simple est peut-être de les faire en Jquery mais la pareil je maîtrise très mal le sujet).

Bref si une bonne âme pourrait me mettre sur une piste "comment bien commencer" un tel projet.

Par avance merci

Eléphant du PHP | 267 Messages

16 juin 2012, 13:13

salut,

c'est un sujet qui a été débattu pas mal de fois sur les forums
tu peux donc trouver pas mal de scripts sur le net

Techniquement, voici les grandes lignes (c'est une solution parmi plusieurs) :
- 4 pages en tout (presentation.php, question.php, reponseAjax.php et resultat.php)
- prensentation.php : page simple qui présente le quiz avec un lien vers la page question.php
- question.php : la page principale où il y aura une question affichée
- reponseAjax.php : cette page répondra à une requête Ajax envoyée depuis la page question.php (réponse sera au format XML)
- resultat.php : affiche le résultat final à la fin du quiz

Revenons sur la page question.php :
quand tu arrives sur cette page, tu dois avoir dans ta variable superglobale $_POST le numéro de la question à afficher : $_POST['numQuestion']
dans ta page, tu affiches la question avec les différentes réponses
en dessous, il y a un bouton "Réponse" qui envoie une requête Ajax vers la page reponseAjax.php avec comme données envoyées le numéro de la question et la réponse cochée
Le serveur réceptionne cette requête et renvoie une réponse XML du style (dans le cas où la réponse du candidat est fausse) :
<reponse>
<resultat>NOK</resultat>
<justification>la justification de la réponse</justification>
</reponse>
si la réponse du candidat avait été correcte, à la place de NOK, on aurait eu OK
si il y a des caractères accentués dans la justification comme c'est le cas dans mon exemple, dans l'en-tête XML, il faudra préciser que le jeu de caractères employé est le iso-8859-1 (l'envoi de la requête Ajax se fait, par contre, toujours en UTF-8)
Lorsque le navigateur reçoit la réponse du serveur, il analyse en javascript le flux xml et modifie la page en conséquence (si le candidat n'a pas correctement répondu, mettre un fond rouge sur la réponse cochée et afficher en dessous la justification)

Dans la page question.php, il y a également un bouton "Question suivante" qui est un lien vers la même page où le $_POST['numQuestion'] a été incrémenté de 1

Au début de la page "question.php", il y a un bout de code pour stocker la réponse du candidat dans la base de donnée

Voici les grandes lignes

Bon courage,
dix2

Eléphant du PHP | 267 Messages

16 juin 2012, 13:31

dans la réponse XML du serveur, j'ai oublié de mettre la bonne réponse à la question
ce qui donne :
<reponse>
<idGoodAnswer>3</idGoodAnswer>
<justification>la justification de la réponse</justification>
</reponse>

la balise <resultat> n'est plus obligatoire
En fait, c'est un peu plus compliqué que ce que je croyais :
Dans la page reponseAjax.php, il faut également enregistrer la réponse du candidat dans la base de données SI celle-ci n'a pas déjà été enregistrée
De même que dans la page question.php, au début, il faut enregistrer la réponse du candidat dans la base de données SI celle-ci n'a pas déjà été enregistrée

dix2

Eléphanteau du PHP | 10 Messages

16 juin 2012, 14:45

Merci dix2 d'avoir pris le temps de me répondre.

Hum va falloir que je m'y mette sérieusement. Si j'ai bien compris la logique du développement l'écrire va être une autre paire de manche.
Des scripts tout fait j'en ai trouvé quelques uns mais aucun qui correspondent fidèlement à mes attentes (quand à les modifier quand on y connait presque rien...).

Je prépare l'aspirine et fais chauffer le café... au boulot

Mammouth du PHP | 2278 Messages

16 juin 2012, 15:31

fallait peut-être écouter en cours et faire les exos.
Les qcm et autres sont la tare à la crème de la majorité des initiations à la programmation.
Ceci étant dit, les résultats en sont absolument sans intérêt...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 10 Messages

16 juin 2012, 17:31

D'accord avec toi ce genre d'exercice doit être la base de la programmation pour qui a suivit les cours adéquates... ce qui est absolument pas mon cas puisque ce n'est ni ma formation ni mon métier.
Quand à l’intérêt des résultats c'est peut-être fonction des questions que tu poses non ?

Eléphant du PHP | 267 Messages

16 juin 2012, 17:58

Nodibb,

je t'ai envoyé un MP
look at it

dix2