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

  1. 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).

  2. 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 commande

    sudo 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 que mysql_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 commande mysql

    Pour quitter mysql, tappez simplement ctrl+D.

  3. 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ête

    SELECT 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é.

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

  5. 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;
    
  6. 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 fois phpMyAdmin installé, vous pouvez consulter sa configuration dans le fichier /etc/apache2/conf-enabled/phpmyadmin.conf.

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

  1. 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.
  2. 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.

  1. 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).
  2. À 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.
  3. 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 et password_verify (constulez la documentation).

Importation d'une base de données

  1. 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.
  2. Crééz une page films_2006.php affichant sous la forme d'un tableau les informations contenues dans cette table.
  3. 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.