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.
- 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 tableanimals
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 ! - Créer une classe
AnimalStorageMySQL
danssrc/model
qui 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
AnimalStorageFile
que 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.php
et 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.php
dans le répertoireprivate
qui se trouve à la racine de votre compte web (à côté dewww-prod
etwww-dev
). Y déclarer des constantesMYSQL_HOST
,MYSQL_PORT
,MYSQL_DB
,MYSQL_USER
etMYSQL_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.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 ! - 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=2
etsite.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). - 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.