close

Exercice PHP 8 - TD Numéro 5

#1 Objectifs du TD open

Je veux fabriquer un outil qui va m'aider à mémoriser des informations importantes que j'ai besoin de me souvenir.

  1. 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
    Fonctionnement de l'outil : tirage de la question.
  2. 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
    Fonctionnement de l'outil : affichage de la question/réponse.
  3. 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 open

Sujet de la première étape.

Mettre en place une "navigation" dans un script principal (* index.php) de sorte que :

  1. Lorsqu'on lance le script sans query string, alors le script affiche le message "Tirer au sort la question et l'afficher".
  2. 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.
  3. Utiliser la valeur d'une variable $numero pour différencier ces deux cas.
  4. Tester avec un navigateur.

Solution de la première étape 😃.

  1. Créez un répertoire Test sur le bureau. Prenez-le comme espace de travail dans VSCode. Créez le fichier index.php. C'est une bonne idée de regarder la version de PHP. Lancez le serveur interne à PHP au moyen de la commande php -S localhost:3000.
  2. 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.
  3. Utilisez la variable $numero et l'opérateur de coalescence null. Si numero est dans la query string, alors la superglobale $_GET['numero'] est définie. Affectez-la à $numero. Sinon, affectez à $numero la valeur null.
  4. 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 open

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 😃.

  1. Commencez par mettre en place le bouton "Afficher Réponse". Pour cela, vous avez besoin d'un formulaire et d'un bouton submit. 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.
  2. Utilisez l'abréviation Emmet form>input[type='submit']. Je complète avec le champ value='Afficher Réponse'.
  3. 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 champ name=numero et la valeur value='2'. Mettez 2 en dur, car la fonction qui va tirer au sort le numéro n'est pas encore écrite.
  4. Ajoutez maintenant le bouton Question Suivante.

#4 Sujet et solution pas à pas : Troisième étape open

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.

  1. Créez le fichier data.php et l'inclure dans le script principal.
  2. Vérifiez que le fichier existe sinon arrêter le script et afficher le message "Fichier non trouvé".
  3. Essayez d'ouvrir le fichier en lecture et récupérer une "resource" que l'on va appeler $fd (* comme file descriptor).
  4. 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 fichier data.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 fonction explode.
  5. On ne traitera pas le cas où le fichier est vide...

Solution de la troisième étape 😃.

  1. Récupérez les données ICI et placez-les dans un fichier data.txt.
  2. Créez le fichier data.php et l'inclure dans index.php avec un require "data.php".
  3. Maintenant dans le fichier data.php c'est une bonne idée de créer une constante const MY_DATA_FILE = 'data.txt'.
  4. 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.
  5. Avec la fonction standard PHP file_exists, testez si le fichier existe. S'il n'existe pas alors, utilisez die pour arrêter le script avec le message Fichier non trouvé.
  6. Ensuite, essayez d'ouvrir le fichier avec fopen. Si le fichier ne s'ouvre pas, stoppez l'exécution du script avec un die et le message Echec ouverture fichier.
  7. Maintenant, écrivez la fonction getQR. Elle prend en argument $fd et elle retourne un tableau.
  8. Déclarez un tableau vide $qr.
  9. Pour lire le fichier ligne à ligne, servez-vous de $line = fgets(...) comme condition d'une boucle while. Pour avoir la clé ['question'], servez-vous de explode(',', $line)[0].
  10. Etant donné que vous bouclez, il va falloir mettre un élément indexé devant la clé soit $qr[$i]['question'].
  11. Il ne vous reste plus qu'à déclarer ce $i, puis à l'incrémenter et enfin à retourner le tableau.
  12. Pour tester, faites un var_dump du tableau.

#5 Sujet et solution pas à pas : Quatrième étape open

Sujet de la quatrième étape.

  1. Tirez au sort le numéro de la question.
  2. Mettez en place les echo de la question et de la réponse.
  3. Ecrivez deux fonctions : afficherQuestion() et AfficherQuestionReponse(). Ces deux fonctions doivent encapsuler les echo et les deux formulaires HTML qui sont au milieu du script principal. Cela améliorera la lisibilité.
  4. Mettez les deux fonctions dans un fichier séparé afficher.php.
  5. Petite précaution pour éviter les injections en tous genres, s'assurer que lorsque $numero n'est pas null, il vaut bien une chaîne numérique. Sinon, stoppez le script.

Solution de la quatrième étape 😃.

  1. Pour le tirage au sort, utilisez un moteur de recherche avec les termes fonction aléatoire php. Vous devez trouver la fonction rand(). 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.
  2. Mettez en forme les affichages de la question et de la réponse.
  3. N'oubliez pas le value du champ caché, dans lequel il faut injecter le $numero tiré au sort.
  4. Créez un fichier afficher.php faire le require.
  5. Dans les deux fonctions que j'ai demandé de créer, c'est intéressant de mettre les echo et les formulaires.
  6. 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 pas null. Utilisez la fonction standard is_numeric() qui détermine si une variable est un nombre ou une chaîne numérique.

#6 Conclusion open

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.