Utilisation d'une BD MySQL dans MVCR

2024-2025

Licence Informatique 3ème année

Alexandre Niveau

Enseignement des technologies du Web

 

Travail personnel

Exercice 0 — Utilisation d’une base de données dans MVCR #

Dans cet exercice, on implémente simplement l'interface AnimalStorage en utilisant une vraie base de données MySQL. J'en profite pour préciser quelques détails annexes, mais sur le fond il n'y a pas de surprise, c'est assez direct.

  1. Créer une table dans une de vos bases de données MySQL qui contiendra les animaux. Voir cette page de la FAQ du département pour savoir comment accéder à vos bases. À noter en particulier, votre mot de passe initial pour MySQL est dans le répertoire Protected de votre répertoire par défaut (/home/etudiants/LOGIN/Protected/mysql.txt). Vous pouvez utiliser (ou adapter) ce fichier, qui contient le code SQL permettant de créer une table animals avec les trois animaux de départ. Le plus simple pour ajouter la table à votre BD est d'utiliser la fonction d'import sur l'application phpMyAdmin, accessible à https://dev-LOGIN.users.info.unicaen.fr/phpmyadmin. Attention, il faudra a priori créer une base, et tous les noms ne sont pas autorisés !
  2. Créer une classe AnimalStorageMySQL dans src/model qui implémente AnimalStorage. Pour commencer, on construira l'instance de PDO dans le constructeur, et toutes les méthodes enverront une exception avec un message du genre « not yet implemented ».
  3. Remplacer l'instance de AnimalStorageFile que manipule le contrôleur par une instance de AnimalStorageMySQL ; normalement, il doit suffire de modifier site.php. Aller sur la page affichant la liste des animaux : vous devez voir votre exception « not yet implemented ».
  4. On va implémenter readAll() en premier ; mais avant d'écrire la vraie requête, écrire une requête syntactiquement fausse, par exemple SELECTE ETOILE;. Retourner sur la page affichant la liste des animaux : vous devez toujours avoir une exception, mais cette fois due à une erreur de syntaxe SQL. Si ce n'est pas le cas, c'est que vous n'avez pas activé le bon mode de gestion des erreurs ! Faites-le avant de continuer !
  5. À présent, écrire la requête correcte dans readAll() pour récupérer tous les animaux de la base. Attention, il ne suffira pas de renvoyer le résultat : readAll() est supposée renvoyer un tableau d'instance de la classe Animal. C'est à vous de créer ce tableau, à partir des données « brutes » renvoyées par PDO.
  6. Retourner sur la page affichant la liste des animaux : elle doit maintenant fonctionner comme avant. Évidemment, si vous cliquez sur l'un d'eux, la page individuelle ne fonctionnera pas puisque la méthode read($id) n'est pas encore implémentée. Pas d'urgence : continuez d'abord l'exercice.
  7. Il n'est pas propre de construire l'instance de PDO dans AnimalStorageMySQL : si on a plusieurs classes de ce type, on va construire plusieurs instances de PDO et donc ouvrir plusieurs connexions à la BD, ce qui est inefficace. Modifier le code pour que l'instance de PDO soit créée dans site.php et passée en argument au constructeur de AnimalStorageMySQL.
  8. Pour l'instant, on a mis les paramètres de connexion à la BD dans site.php, notamment le mot de passe. C'est embêtant si on veut montrer notre code ou le mettre sur un dépôt. Créer un fichier mysql_config.php dans le répertoire private qui se trouve à la racine de votre compte web (à côté de www-prod et www-dev). Y déclarer des constantes MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USER et MYSQL_PASSWORD.
  9. Dans site.php, ajouter require_once('/users/LOGIN/private/mysql_config.php'); et utiliser les constantes pour construire l'instance de PDO. L'intérêt est que le fichier mysql_config.php est inaccessible depuis le web, ce qui garantit une bonne sécurité pour vos identifiants. Vos scripts PHP y ont accès car ils sont sur la même machine. NB: vos identifiants ne doivent pas être présents sur le dépôt Git !
  10. Vérifier que la page avec la liste fonctionne toujours, puis implémenter la méthode read($id) de AnimalStorageMySQL.
  11. Vérifier que les pages site.php?id=1, site.php?id=2 et site.php?id=3 fonctionnent comme avant (NB: les identifiants ne seront probablement pas les mêmes que ceux que vous utilisiez jusque-là : ça ne devrait pas affecter l'application).
  12. Que se passe-t-il si vous utilisez l'URL site.php?id=bla'bla (avec une apostrophe au milieu) ? Normalement, votre site devrait vous dire que l'animal n'existe pas. S'il y a une erreur SQL, c'est très probablement que votre code est vulnérable aux injections SQL. Modifier le code de read($id) pour utiliser des requêtes préparées.