Programmation Web II
M1 MIASHS parcours Web Analyst (2022 - 2023)
PHP et MySQL
Les bases de données sont largement utilisées pour stocker des informations côté serveur. Une fois stockée, ces données peuvent être accédées par PHP pour générer les parties "variables" de pages web. Les bases de données sont par exemple utilisées pour stocker les login/mots de passes ainsi que toutes autre données propres aux utilisateurs. On y retrouvera aussi les sujets et messages d'un forum, une liste de produits disponibles, etc. Il existe différents systèmes de gestion de bases de données. Dans ce cours, nous utiliserons mysql
.
Installation d'une base de données
L'installation du système de gestion de base de données prend de la place. Créez une nouvelle VM, cette fois avec un gabarit "moyen". Installez-y apache2 et PHP, et faites en sorte que s'affichent les erreurs PHP (suivez pour cela les démarches du TP1).
Installez un serveur
mysql
sur votre machine virtuelle :sudo apt-get install mysql-server
Si l'installation de
mysql
échoue, en retournant un code erreur, vous pouvez essayez de la réparer avec la commandesudo apt --fix-broken install
Une fois correctement installé,
mysql
se trouve dans une configuration rudimentaire et non sécurisé. La sécurité de l'installation peut être améliorée à l'aide d'outils tel quemysql_secure_installation
mais cela n'est pas nécéssaire pour la suite de ce TP.Une fois
mysql
installé, vous pouvez "entrer" dans votre base de données, afin d'interagir avec elle, avec la commandemysql
Pour quitter
mysql
, tappez simplement ctrl+D.Nous allons à présent ajouter un compte utilisateur à la base de données. Dans
mysql
, vous pouvez lister les différents utilisateurs avec la requêteSELECT user, host FROM mysql.user;
Ajoutez un utilisateur avec la requête suivante :
CREATE USER 'nom_utilisateur_choisi'@'localhost' IDENTIFIED BY 'mot_de_passe';
en remplacant naturellement nom_utilisateur_choisi et mot_de_passe par l'identifiant et le mot de passe de votre nouvel utilisateur. Listez à nouveau les utilisateurs afin de vérifier que le nouvel utilisateur a bien été ajouté.
Pour vérifier que le nouveau compte uitilisateur a bien été ajouté, essayez également de vous reconnecter avec (après vous être déconnecté) à l'aide de la commande :
mysql -u *login* -p
À tout moment, vous pouvez vérifier le compte avec lequel vous êtes connecté à mysql avec la commande
SELECT CURRENT_USER;
Authentifié avec sur le compte que vous venez de créer, essayez de créer une base de donnée à l'aide de la commande :
CREATE DATABASE testDB;
Comme vous le constatez, votre utilisateur fraichement créé ne possède pas les droits suffisants. Vous allez donc lui donner.
Reconnectez-vous en root à mysql afin d'attribuer les droits de création à votre utilisateur. Commencez par consulter ses droits actuels avec la commande :
SHOW GRANTS FOR login@localhost;
Pour information, les droits
USAGE
qui sont donnés par défaut signifient "pas de droits". En temps qu'administrateur de votre base de données, vous avez la possibilité d'attribuer différents niveaux de droits à vos utilisateurs : pouvoir créer des BD ou des tables, simplement les consulter, avoir le droit de les modifier, etc. Vous pouvez donner la permission à votre utilisateur de créer des BD avec l'instruction suivante :GRANT CREATE ON *.* TO login@localhost;
N'hésitez pas à consulter la liste des privilèges disponibles dans le manuel de mysql. Afin de faciliter la suite, nous allons donner tous les droits à notre utilisateur :
GRANT ALL ON *.* TO login@localhost;
Afin d'intéragir avec notre base à travers une interface plus conviviale, nous allons installer l'outil
phpMyAdmin
:sudo apt-get install phpmyadmin
Au cours de l'installation, il vous sera demandé de sélécionner le serveur web qui doit être configuré pour exéctuer phpMyAdmin. Dans votre cas il s'agit naturellement de apache2 (appuyez sur la touche espace pour séléctionner). Il vous sera ensuite demandé si vous désirez utiliser
dbconfig-common
pour configurer la base de données. Dites oui. Une foisphpMyAdmin
installé, vous pouvez consulter sa configuration dans le fichier/etc/apache2/conf-enabled/phpmyadmin.conf
.- Vous pouvez à présent vous rendre sur la page
phpmyadmin
de votre machine virtuelle via votre navigateur à l'URL @IP/phpmyadmin
Si vous obtenez une erreur 404 (not found), vérifiez que l'installation de phpmyadmin est bien parvenue à créer le fichier /etc/apache2/conf-enabled/phpmyadmin.conf
sur votre VM. Si ça n'est pas le cas, créez vous-même ce lien symbolique à l'aide de la commande suivante :
sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
Création d'une base de données à l'aide de phpMyAdmin
- En utilisant l'interface phpMyAdmin, authentifié avec l'identifiant créé précédemment, crééz une table
USERS
(à l'intérieur d'une base dédiée à ce TD) dédiée au stockage des logins, mots de passe, date de naissance, pays de résidence des utilisateurs d'un site web. - Toujours à l'aide de phpMyAdmin, entrez manuellement dans la table plusieurs lignes correspondant à des utilisateurs fictifs.
Consultation d'une base de données avec PHP
Afin d'avoir accès aux données stockées dans une base, PHP a besoin d'établir une connexion avec la base. L'extension PDO fournit des outils pour cela. L'ouverture d'une connexion s'effectue par la création d'un objet de type PDO
:
try{
$base = new PDO('mysql:host=hôte_BD;dbname=nom_BD','login_DB','mdp_DB');
} catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
Les blocs try
et catch
permettent de traiter correctement une éventuelle erreur. Ils permettront notamment d'éviter que s'affiche à l'écran du visiteur un message d'erreur faisant apparaître son mot de passe. Une fois la connexion correctement ouverte, une requête s'effectue auprès de la base à l'aide de la fonction PHP query
:
$reponse = $base->query('requête');
La fonction query
retourne la réponse de la base de données à la requête qui est ici stockée dans la variable $reponse
. Dans le cas d'une requête SELECT
, la réponse en question consistera généralement en une liste de "lignes" de la table, contenant chacune un certain nombre de champs. Le contenu de cette réponse se parcourt alors à l'aide de l'instruction $reponse->fetch()
qui renvoie à chaque appel une ligne de la réponse sous la forme d'un tableau associatif dont les clés correspondent aux noms des champs inclus dans la ligne, ou bien la valeur booléenne false
si toutes les lignes de la réponse ont été renvoyées. Le parcours de l'ensemble des lignes d'une réponse pourra typiquement s'utiliser à l'aide d'une boucle while :
while($ligne = $reponse->fetch()){
...
}
Une fois les éléments de la réponse parcouru, il est nécessaire d'annoncer la "fin du travail sur la requête" en fermant le curseur d'analyse des résultats avec l'instruction suivante :
$reponse->closeCursor();
Dans certain cas, la requête SQL retourne une simple valeur. C'est par exemple le cas lorsqu'on utilise SELECT COUNT(*) FROM ...
qui retourne le nombre de lignes satisfaisant la requête. On peut dans ce cas récupérer cette valeur à l'aide de la méthode fetchColumn()
:
$nombre_lignes = $reponse->fetchColumn();
La fonction query
s'utilise pour la récupération de données. Pour éditer une table (par exemple lors d'un ajout de données avec la fonction SQL INSERT
), il faudra utilise la fonction
$base->exec('requête');
Afin de l'administrer plus facilement, le webmaster peut généralement manipuler sa base de données via une interface graphique comme phpMyAdmin. Cette interface vous permettra de créer, modifier, visualiser et supprimer les tables de votre base de donnée.
- Reprenez la page d'authentification du précédent TD (sur les formulaires) et faites en sorte que l'authentification se réfère à cette table (plutôt qu'à un tableau PHP).
- À la suite du formulaire d'authentification, ajouter un lien permettant à un nouveau visiteur de s'inscrire. Ce lien redirige vers une nouvelle page "inscription" permettant à un nouvel utilisateur de saisir dans un formulaire les informations permettant d'ajouter une nouvelle entrée dans la table
USERS
. - Pour des raison de sécurité, il est d'usage de crypter les mots de passe des utilisateurs afin qu'ils ne soient pas stockés "en clair" dans la base de données. La méthode généralement utilisée consiste à utiliser une fonction de hachage qui retourne une représentation cryptée du mot de passe. Ces fonctions sont élaborée de telle sorte qu'il est très facile d'obtenir la version cryptée d'un mot de passe, mais à priori impossible d'obtenir le mot de passe à l'origine d'une expression cryptée. Afin de contrôller une tentative d'authentification, ce sont les deux expressions cryptées qui sont comparées. Ajoutez cette fonctionnalité à l'aide des fonctions
password_hash
etpassword_verify
(constulez la documentation).
Importation d'une base de données
- Depuis l'interface web permettant de gérer votre base de données, importez le fichier sakila-simple.sql. Cette base de données regroupe 1000 films.
- Crééz une page
films_2006.php
affichant sous la forme d'un tableau les informations contenues dans cette table. - Afin d'alléger cette page, limiter la visualisation à N films (N pouvant être choisi parmis 10, 30 ou 50 dans une liste déroulante par le visiteur). Le bas de page doit permettre d'accéder directement aux différents paquets de N pages. Deux liens sont spécialement dédiés au paquet précédent et au paquet suivant. Inspirez-vous pour cela de la page de recherche de Google.