Exercice PHP 8 - TD Numéro 5
#1
Objectifs du TD
Je veux fabriquer un outil qui va m'aider à mémoriser des informations importantes que j'ai besoin de me souvenir.
- L'outil me pose une question. Je vérifie si j'ai la réponse en tête. Ensuite, je demande l'affichage de cette réponse.
DEMO - L'outil affiche alors la question et sa réponse. Je peux vérifier si j'avais ou pas la bonne réponse en tête.
DEMO - L'outil prend les questions/réponses dans un fichier qu'il lit à chaque lancement. (* fichier data.txt ci-dessous).
#2
Sujet et solution pas à pas : Première étape
Sujet de la première étape.
Mettre en place une "navigation" dans un script principal (* index.php) de sorte que :
- Lorsqu'on lance le script sans query string, alors le script affiche le message "Tirer au sort la question et l'afficher".
- Lorsqu'on lance le script avec une query string qui contient
numero=2
, alors le script affiche le message "Afficher question/réponse numéro 2. - Utiliser la valeur d'une variable
$numero
pour différencier ces deux cas. - Tester avec un navigateur.
Solution de la première étape 😃.
- Créez un répertoire
Test
sur le bureau. Prenez-le comme espace de travail dans VSCode. Créez le fichierindex.php
. C'est une bonne idée de regarder la version de PHP. Lancez le serveur interne à PHP au moyen de la commandephp -S localhost:3000
. - Dans le sujet, je vous demande de tester avec un navigateur, alors il vous faut une page avec une structure HTML de base avec du PHP inséré dedans.
- Utilisez la variable
$numero
et l'opérateur de coalescence null. Sinumero
est dans la query string, alors la superglobale$_GET['numero']
est définie. Affectez-la à$numero
. Sinon, affectez à$numero
la valeurnull
. - De cette manière, vous pouvez différencier les deux cas (* "Tirer au sort la question et l'afficher" ou "Afficher la question/réponse").
#3
Sujet et solution pas à pas : Deuxième étape
Sujet de la deuxième étape.
Dans cette deuxième étape, je demande d'ajouter les boutons de manière à finaliser la navigation.Solution de la deuxième étape 😃.
- Commencez par mettre en place le bouton
"Afficher Réponse"
. Pour cela, vous avez besoin d'un formulaire et d'un boutonsubmit
. Ca, c'est du HTML. Donc pour insérer ce HTML, vous devez refermer le PHP avec la balise de fermeture?>
puis le rouvrir avec la balise d'ouverturte<?php
. Ensuite, vous insérez votre HTML entre ces deux balises. - Utilisez l'abréviation Emmet
form>input[type='submit']
. Je complète avec le champvalue='Afficher Réponse'
. - Attention, n'oubliez pas que vous devez envoyer le numéro du couple question/réponse pour que le script puisse retrouver la réponse. Pour cela, utilisez un champ caché. Un champ caché, c'est une information qui se trouve dans le formulaire, mais qui n'est pas affichée à l'écran. Cette fois, utilisez l'abréviation Emmet
input[type='hidden']
. Ajouter le champname=numero
et la valeurvalue='2'
. Mettez2
en dur, car la fonction qui va tirer au sort le numéro n'est pas encore écrite. - Ajoutez maintenant le bouton
Question Suivante
.
#4
Sujet et solution pas à pas : Troisième étape
Sujet de la troisième étape.
Maintenant, on va s'occuper du fichier de données. L'objectif est de créer un fichier séparé data.php
qui contiendra le nécessaire à la gestion du fichier de données data.txt
.
- Créez le fichier
data.php
et l'inclure dans le script principal. - Vérifiez que le fichier existe sinon arrêter le script et afficher le message "Fichier non trouvé".
- Essayez d'ouvrir le fichier en lecture et récupérer une
"resource"
que l'on va appeler$fd
(* comme file descriptor). - Fabriquez une fonction
getQR()
qui prend en argument$fd
et retourne un tableau multidimensionnel. Le tableau contient autant d'éléments qu'il y a de lignes dans le fichierdata.txt
. Chaque élément est un tableau associatif qui a deux clés. Une clé'question'
et une clé'reponse'
. Pour la structure du tableau, le TD4 peut vous aider. Pour récupérer la question ou la réponse d'une ligne, il faut se servir de la fonctionexplode
. - On ne traitera pas le cas où le fichier est vide...
Solution de la troisième étape 😃.
- Récupérez les données ICI et placez-les dans un fichier
data.txt
. - Créez le fichier
data.php
et l'inclure dansindex.php
avec un require "data.php". - Maintenant dans le fichier
data.php
c'est une bonne idée de créer une constanteconst MY_DATA_FILE = 'data.txt'
. - Une autre bonne idée serait de prendre un moteur de recherche et de chercher "php fonction système de fichier". Ceci devrait vous amener à ouvrir cette PAGE DU MANUEL PHP.
- Avec la fonction standard PHP
file_exists
, testez si le fichier existe. S'il n'existe pas alors, utilisezdie
pour arrêter le script avec le messageFichier non trouvé
. - Ensuite, essayez d'ouvrir le fichier avec
fopen
. Si le fichier ne s'ouvre pas, stoppez l'exécution du script avec undie
et le messageEchec ouverture fichier
. - Maintenant, écrivez la fonction
getQR
. Elle prend en argument$fd
et elle retourne un tableau. - Déclarez un tableau vide
$qr
. - Pour lire le fichier ligne à ligne, servez-vous de
$line = fgets(...)
comme condition d'une bouclewhile
. Pour avoir la clé['question']
, servez-vous deexplode(',', $line)[0]
. - Etant donné que vous bouclez, il va falloir mettre un élément indexé devant la clé soit
$qr[$i]['question']
. - Il ne vous reste plus qu'à déclarer ce
$i
, puis à l'incrémenter et enfin à retourner le tableau. - Pour tester, faites un
var_dump
du tableau.
#5
Sujet et solution pas à pas : Quatrième étape
Sujet de la quatrième étape.
- Tirez au sort le numéro de la question.
- Mettez en place les
echo
de la question et de la réponse. - Ecrivez deux fonctions :
afficherQuestion()
etAfficherQuestionReponse()
. Ces deux fonctions doivent encapsuler lesecho
et les deux formulaires HTML qui sont au milieu du script principal. Cela améliorera la lisibilité. - Mettez les deux fonctions dans un fichier séparé
afficher.php
. - Petite précaution pour éviter les injections en tous genres, s'assurer que lorsque
$numero
n'est pasnull
, il vaut bien une chaîne numérique. Sinon, stoppez le script.
Solution de la quatrième étape 😃.
- Pour le tirage au sort, utilisez un moteur de recherche avec les termes
fonction aléatoire php
. Vous devez trouver la fonctionrand()
. Vous devez passer en argument l'intervalle des valeurs que vous voulez tirer au sort. Donc ici le min, c'est 0 et le max, c'est la taille du tableau moins 1. - Mettez en forme les affichages de la question et de la réponse.
- N'oubliez pas le
value
du champ caché, dans lequel il faut injecter le$numero
tiré au sort. - Créez un fichier
afficher.php
faire lerequire
. - Dans les deux fonctions que j'ai demandé de créer, c'est intéressant de mettre les
echo
et les formulaires. - Enfin, vous devez toujours faire très attention à ce qui peut être injecté dans un script. Pour cela, dans
index.php
, filtrez la variable$numero
lorsqu'elle ne vaut pasnull
. Utilisez la fonction standardis_numeric()
qui détermine si une variable est un nombre ou une chaîne numérique.
#6
Conclusion
Il faut que vous soyez capable de faire cet outil tout seul. Si vous avez besoin de le faire plusieurs fois, eh bien, faites le plusieurs fois. Il sera intéressant de refaire cet outil avec des classes et de comparer les codes.