DAJANA KAPUSOVA
TECFA Education and Technologies
Université de Genève 
[ Accueil ] [ Liens ] [ Travaux ]

Questionnaire avec PHP

Démarche personnelle

Le but de cet exercice était de construire un test (ou un quiz) on-line qui permette de recevoir un feedback.

Au départ, je pensais lier cet exercice à mon activité professionnelle, mais je n'ai pas trouvé d'idée intéressante. Mais un jour de la semaine présentielle, j'ai eu une "illumination". Je me sentais un peu isolée des autres Jolans puisqu'ils ne vennaient pas sur TecfaMOO, mais allaient sur MSN Messenger (mais franchement êtes-vous dignes d'être des Jolans!?!). J'ai craqué et me suis mise aussi sur Messenger. Bien sûr, que je n'aurais pas laissé les Jolans s'en tirer comme ça. J'ai décidé donc de créer un quiz pour tester leurs connaissances sur le MOO et surtout de rendre public les résultats. Mon questionnaire porte le titre "Do you speak MOO" que l'on peut trouver dans mon MOO-finger avec la suite: "Me TOO".

Le quiz devait être destiné qu'aux Jolans, mais ayant trouvé cette idée très originale, j'ai décidé de permettre aux autres fidèles du MOO de le faire aussi (mais sous conditions qu'ils fassent parti de Tecfa, donc figurer dans LDAP de Tecfa). Il suffisait d'extraire la liste des gens qui se sont connectés sur TecfaMOO pendant le dernier mois et d'associer les noms des personnages dans le MOO avec les personnes dans LDAP. Le questionnaire est destiné plutôt pour avoir du FUN.

Objectifs de la réalisation

Ayant des bases de programmation PHP et de MySQL, l'exercice ne me semblait pas très difficile, même si je n'écris pas toujours du code très propre et il y a encore du travail à faire en ce qui concerne les formulaires et la récupération des données, ainsi que leur exploitation.

Ayant travaillé sur le projet d'enseignement à distance SUPPREM,j'ai construit plusieurs quizz dans la plate-forme Oracle iLearning. Celle-ci permet de construire plusieurs types de questions (choix multiples avec une seules réponse correcte, choix multiples avec plusieurs réponses correctes, vrai ou faux, texte à trous avec insertion de texte, texte à trous avec insertion de nombres). A une réponse, correcte ou incorrecte, un feedback est associé. Je me suis vite rendue compte des limites de certains types de questions, comme p.ex.:

Cet exercice devrait me permettre de comprendre comment un formulaire est construit et de quele manière les réponses sont récupérées et un feedback peut y être associé.

Avant de commencer cet exercice, je n'avais pas encore une idée très précise de ce que mon exercice allait devenir. En avançant dans ma réalisation, j'ai pu fixer plusieurs objectifs et contraintes:

Mon dispositif n'égligera les aspects suivants:

Design du dispositif

J'ai donné un titre au quiz: "Do you speak MOO" que l'on retrouve au début de chaque page du dispositif entouré de deux vaches (j'ai repris l'image que l'on trouve sur les pages associées au projet TecfaMOO). Pour rendre plus gaie l'interface, j'ai choisi d'utiliser la couleur orange qui s'associe très bien avec la couleur jaune de la vache (au départ j'ai voulu utiliser le jaune, mais celui-ci n'était pas très visible sur l'écran). Les boutons prennent également la couleur orange.

Chaque question est facilement identifiable par un titre "Question x", entre les questions se trouve une barre horizontale. La zone des réponses (checkbox, radio, textarea) a un retrait plus à droite fait avec la balise <blockquote>. Pour distinguer mieux visuelement le texte des commandes que l'on tape dans le client MOO, j'ai choisi de mettre les commandes en style "code" et dans la page avec les résultats elles sont en plus en gras. Dans la page avec le classement, pour mieux lire le tableau, j'ai fait alterner une ligne blanche avec une ligne grise.

La navigation entre les pages est assurée soit à l'aide des boutons (pour soumettre), soit avec un lien hypertexte (vers le classement, retour au questionnaire).

Implémentation et fonctionnement du dispositif

Le dispositif comprend des pages PHP dont certaines contiennent une requête SQL sur la base de données MySQL du serveur tecfa. Le dispositif fonctionne de la manière suivante:

  1. questionnaire.php (code source)
    Le participant arrive sur la première page qui contient des instructions et où il choisit (<form>) le nom du MOO-personnage (requête sur la table "moo" en affichant les noms des personnage par ordre alphabétique croissant).
  2. moo-quest.php (code source)
    Le nom du personnage est associé au nom et prénom de la personne du personnage (requête sur la table "moo" en extrayant le nom et le prénom qui correspond au MOO-personnage).
    Le participant remplit le quiz (<form>) en cochant une réponse (checkbox), en tappant la réponse (text, textarea) ou en choisissant une réponse (radio) et il le soumet.
  3. moo-result.php (code source)
    Les données sont récupérées et en fonction de la réponse (if-elseif-else, switch), un score est calculé et un feedback est donné.
    Une statistique lui est faite sur son personnage (requête sur la table "moo" en extrayant certaines données sur le personnage) et un bonus est calculé.
    La note finale est affichée.
    Le résultat du quiz est enregistré (requête sur la table "moostat" en insérant les réponses du quiz, le score et le bonus, ainsi que la date.
    Le participant peut accéder au classement général.
  4. moo-stat.php (code source)
    Le classement trié par ordre alphabétique des personnage s'affiche (requête sur la table "moostat" en sélectionnant les champs avec le nom du MOO-personnage, le score et le bonus, le total calculé dans la requête SQL et en triant par le nom du personnage).
    Le classement peut être trié par d'autres critères en le choisissant dans une liste déroulante (<form>, action dans la même page - PHP_SELF) (requête sur la table "moostat"; s'il s'agit du score, du bonus ou du total, le tri est fait par ordre décroissant et en plus un autre tri est fait par ordre alphabétique sur les personnages).
    Les commentaires des participants sont affichés (il s'agit de la réponse à la question 6).

carte
Figure: fonctionnement du dispositif

Aspects techniques

Pour la création des pages PHP j'ai utilisé Dreamweaver qui est facile d'emploi et que je connais assez bien. Pour la base de données, j'ai utilisé au début MySQL sur le serveur silene.unige.ch, car je n'avais pas encore accès à la BD sur le serveur de tecfa. Une fois le dispositif terminé, j'ai transféré tous les fichiers sur le serveur de tecfa et ai également importé la BD.

Je divise l'élaboration du dispositif en deux parties: une lié à la création de la base de données, l'autre à la création des pages en PHP.

1. Base de données MySQL

2. Pages en PHP

Voir également les commentaires dans les fichiers source des pages PHP.

Test fait avec IE 5.5, Netscape 7.1 et Mozilla 1.4 sous Windows et avec Netscape 7.0 sous Linux.

Difficultés et commentaires

Avant de commencer cet exercice, j'ai déjà travaillé avec PHP et les formulaires, ce qui m'a très motivé à faire un dispositif plus complexe relié à une BD. Mais toutefois, la structure du questionnaire reste simple, je n'ai pas voulu travailler sur la quantité des questions (en ce qui concerne les possibilités du choix du type des réponses, le tour est très vite fait: INPUT, TEXTAREA, SELECT) mais plutôt sur le traitement des réponses.

On peut se rendre compte que pour certains types, comme les boutons radio, la récupération des données et leur traitement en vue d'un feedback est très simple, tandis que pour les checkbox, ceci peut devenir très vite compliqué si p.ex. on décide de donner une feedback en fonction des combinaisons possibles des réponses cochées. Un bon exemple a été donné pour les checkbox (voir référence "Pages dynamiques avec PHP"), je me suis rendue compte que j'aurais utilisé la façon inefficace pour le faire (checkboxes - multiples variables).

Dans le cas d'une réponse où il est possible de taper la réponse (un input du type texte), les bonne réposes peuvent également devenir infinies si l'on prend en compte qu'un espace de trop n'est pas une erreur. Imaginons par exemple (dans mon cas Question 2) que j'attends du participant la réponse "page daja oui! et toi?". Ceci est l'une des réponses correctes. Mais s'il tape entre les mots p.ex. deux espaces ou s'il met la commande en majiscule, il s'agit tout de même d'une réponse correcte. Que faire avec toutes ces possibilités? Ou si p.ex. il oublie de mettre un espace entre "page" et "daja", donc qu'il tape "pagedaja", il s'agit bien d'une mauvaise réponse, mais il n'était pas loin de la bonne réponse et on pourra dire cela dans le feedback. Dans cet exercice, j'ai décidé de ne traiter que la bonne réponse, le reste étant faux.

J'ai décidé pour mon questionnaire de donner un feedback en fonction de la réponse donnée (pour un input de type radio). Donc si le participant a cinq possibilités à choix, je traite avec if-elseif-else toutes les possibilités, plus une s'il ne choisit rien du tout (empty). Pour un petit questionnaire comme celui de cet exercice, cela ne gène pas trop le concepteur/programmeur, mais imaginns des banques de quizz (je les utilise dans la plate-forme OiL), où toutes les possiblités devraient être traitées. Je comprends mieux maintenant pourquoi on n'a pour une question du quiz que deux feedback: un feedback en retour sur les réponses correctes et un feedback en retour sur les réponses incorrectes.

Un autre point important à savoir est le fait que quand la valeur d'une variable contient un caractère spéciale comme ", ', \ etc. et on l'affiche avec "echo", des antishashes "\" s'afficheront devant. Pour afficher correctement le texte, il faut utiliser la fonction stripslashes(). Pour cet exercice, j'ai pas perdu de temps à chercher d'où ça venait, mais il y a quelque temps en arrière quand j'ai travaillé avec des formulaires avec saisie de texte, je ne comprennais pas pourquoi des antislashes s'affichaient.

Une "nouveauté" pour moi était de déclarer les variables et de récupérer les réponses aux questions dans la variable $_POST. Je m'en serais jamais vraiment rendu compte, mais en mettant dans chaque page error_reporting(E_ALL); j'ai pu voir tous les warnings et notices. J'ai tout de même une notice (Notice: Undefined index: xxx in /xxx.php on line xxx) qui s'affiche sans cesse quand on n'a pas coché une réponse. J'ai mis dans mon code le cas où aucune réponse n'est choisie (empty), mais ceci n'a rien changé. J'ai donc cherché sur internet une explication, et une excellente réponse m'a satisfaite: il ne s'agit que d'un avertissement et pas d'une erreur. Donc je m'en suis plus occupée et après avoir fini mon exercice j'ai enlevé la ligne avec error_reporting().

Une bonne façon de savoir si une réponse a été donné est d'utiliser isset et empty. On peut le faire soit pour les questions elle-mêmes où également pour prévoir l'accès direct à la page PHP sans données. Au départ j'ai pas pensé à la possibilité que quelqu'un accède à la page contenant le feedback par un autre endroit (normalement on fait les questions et on soumet pour obtenir le résultat/feedback). Mais une fois, "accidentellement", j'ai chargé la page du feedback sans passer par la page des questions. La page du feedback, contient une requête SQL qui écrit dans la BD les résultats du quiz et quand j'ai regardé les enregistrements dans la BD, j'ai trouvé un enregistrement où le champ moo_name (qui correspond au nom du MOO-personnage) était vide. Chose étrange, car le participant doit choisir le nom du MOO-personnage dans une liste déroulante et donc cette variable ne peut par conséquent être vide. J'ai quand même mis un certain temps à comprendre que ça venait du fait que j'ai directement accédé à cette page et la variable moo_name était de ce fait vide. Grâce à cet "accident" j'ai pu corriger mon code: si la variable moo_name est vide, alors un lien vers le début du questionnaire s'affiche. (Testez ceci pour le pages moo-quest.php et moo-result.php).

Une autre découverte fut pour moi la possibilité de mélanger du HTML et du PHP ensemble que j'ai vu dans un exemple du transparent "Pages dynamiques avec PHP" (celui où l'on récupère les données dans la même page). Voici la logique du code que j'ai réutilisé justement pour bloquer l'accès à la page des questions et des résultats si l'on ne passe pas par la première page du dispositif. On voit que le "else" peut se refermer beaucoup plus loin.

<?php
if( empty ($moo_name) ) {
afficher un lien vers le début du questionnaire si la variable $moo_name est vide
}
else { //ici c'est le début du else qui va se fermer beaucoup plus loin
?>

ici le code HTML ou PHP

<?php
} //ici la fin du else
?>

En ce qui concerne les fonctions nécessaires pour travailler avec la BD MySQL, j'ai utilisé un exemple trouvé sur le web, le code me semblait très "cleen" et je l'ai adapté à mon besoin. Je suis capable d'écrire des requêtes simple en SQL, et quand je ne me souvenais plus comment faire p.ex. pour faire un tri descendant ou ascendant, ou faire un calcul dynamique sur deux colonnes d'une table (score + bonus), j'ai vite regardé sur internet pour me rafraîchir la mémoire. Pour l'instant je ne me suis pas préoccupée de la manière dont les champs dans la BD sont définis (text, int, varchar ...) car nous devrions voir ceci lors d'une autre période staf 14 et je n'ai pas le temps de m'y plonger pour cet exercice. Mais cela n'empêche pas le dispositif de marcher correctement.

Il me semblait important de faire tester le questionnaire par quelqu'un, de préférence de tecfa et d'avoir ainsi un avis sur mon dispositif qui me permettra de faire des corrections nécessaires. Grand merci à ces deux cobailles qui resteront anonymes! Et merci également à Jacques qui a corrigé mes fautes de français.

Pour tester si mon code HTML est valide, j'ai fait un lien vers le valideur XHTML et CSS, et j'ai testé. L'un de mes soucis principaux est d'apprendre à écrire du code propre et correct.

Bien évidemment, il aurait été plus intéressant de faire ce dispositif dynamiquement dans le MOO avec E_Web, comme me l'a fait remarquer DKS, mais pour l'instant je n'ai pas le bagage nécessaire en programmation dans le MOO.

Erreur trouvée lors de la mise en ligne du questionnaire

Avec la première personne qui a fait le quiz (merci RoRk at WoRk), on s'est apperçu (mais seulement après avoir fait des tests compliqués dans le MOO) qu'il y avait une petite faille entre la première et la deuxième question (comment pager et comment repager). En fait, on peut utiliser plusieurs commandes pour pager à quelqu'un, ainsi que pour repager. Voici un exemple concret.

Vous écrivez à la suite les commandes suivantes:

'daja Bonjour!
page rork Bonjour!
' oui! et toi?

A qui sera envoyé le page écrit en troisième ligne? J'aurais dit à RoRk, mais non, il sera envoyé à daja. De ce fait, il faudra rajouter une condition supplémentaire, pour que le quiz soit vraiment parfait, qui tiendra compte de ce rapport entre la réponse faite à la Question 1 et à la Question 2.

Références

L. Atkinson, Programmation en PHP 4, CampusPress, Paris 2000
Introduction à PHP
Pages dynamiques avec PHP
php.debutant.com - Interroger une table MySQL
www.php.net

 © 2004 by D.K., updated March 2004
Valid XHTML 1.0! Valid CSS!