Travail personnel
Exercice 1 — 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.
- 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
Protectedde 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 tableanimalsavec 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 ! - Créer une classe
AnimalStorageMySQLdanssrc/modelqui implémenteAnimalStorage. 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 ». - Remplacer l'instance de
AnimalStorageFileque manipule le contrôleur par une instance deAnimalStorageMySQL; normalement, il doit suffire de modifiersite.php. Aller sur la page affichant la liste des animaux : vous devez voir votre exception « not yet implemented ». - On va implémenter
readAll()en premier ; mais avant d'écrire la vraie requête, écrire une requête syntactiquement fausse, par exempleSELECTE 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 ! - À 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 classeAnimal. C'est à vous de créer ce tableau, à partir des données « brutes » renvoyées par PDO. - 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. - 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 danssite.phpet passée en argument au constructeur deAnimalStorageMySQL. - 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 fichiermysql_config.phpdans le répertoireprivatequi se trouve à la racine de votre compte web (à côté dewww-prodetwww-dev). Y déclarer des constantesMYSQL_HOST,MYSQL_PORT,MYSQL_DB,MYSQL_USERetMYSQL_PASSWORD. - Dans
site.php, ajouterrequire_once('/users/LOGIN/private/mysql_config.php');et utiliser les constantes pour construire l'instance de PDO. L'intérêt est que le fichiermysql_config.phpest 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 ! - Vérifier que la page avec la liste fonctionne toujours, puis implémenter la méthode
read($id)deAnimalStorageMySQL. - Vérifier que les pages
site.php?id=1,site.php?id=2etsite.php?id=3fonctionnent 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). - 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 deread($id)pour utiliser des requêtes préparées.