Connexion à une base de données avec PHP

Licence Informatique, semestre 6

Alexandre NiveauJean-Marc Lecarpentier — Judith Jeyafreeda Andrew

Enseignement des technologies du Web

 

Connexion à une base de données avec PHP

Notes de cours

Travail personnel

Objectifs

Le premier exercice de ce TP porte purement sur PDO, sans souci architectural. Le second, qui a déjà été proposé comme exercice optionnel dans les deux précédents TP, est une introduction à l'architecture d'un site web. Il est vivement conseillé de l'avoir terminé avant les cours de la semaine prochaine, qui introduiront l'architecture de manière plus formelle.

Exercice 1 — Galerie d’images #

Un corrigé de ce TP est disponible (résultat, archive du code). Attention, le déploiement nécessite d’importer la table SQL ci-dessous dans votre BD, et de créer un fichier de configuration dans votre private (explications dans le code source).

Cet exercice vise à découvrir le fonctionnement de PDO en affichant une galerie d'images. On ne cherchera pas à appliquer l'architecture vue en cours (en tout cas pas dès le début) : l'objectif est de manipuler PDO.

Les informations sur les images à afficher sont dans une table images en base de données. Les images elles-mêmes sont hébergées par Flickr. La description de la table est la suivante :

mysql> desc images;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| title          | varchar(255) | YES  |     | NULL    |                |
| creation_date  | datetime     | YES  |     | NULL    |                |
| thumb_url      | varchar(255) | YES  |     | NULL    |                |
| image_page_url | varchar(255) | YES  |     | NULL    |                |
| author_name    | varchar(255) | YES  |     | NULL    |                |
| author_url     | varchar(255) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

Il y a trois URL, celle de la miniature (thumbnail) de l'image, celle de la page de l'image, et celle de la page de l'auteur. Le fichier images.sql contient le code SQL permettant de créer et remplir cette table.

  1. Utiliser le fichier fourni pour créer la table images dans une de vos bases de données MySQL. Voir cette page de la FAQ du département pour savoir comment y accéder. À noter en particulier, le mot de passe initial de votre BD est dans le répertoire Protected de votre répertoire par défaut (/home/etudiants/NUMETU/Protected/mysql.txt). Le plus simple pour ajouter la table à votre BD est d'utiliser la fonction d'import sur l'application phpMyAdmin, accessible à https://dev-NUMETU.users.info.unicaen.fr/phpmyadmin.
  2. Dans un script galerie.php, créer une instance de PDO qui se connecte à la base.
  3. Afficher une liste des titres de toutes les images de la base. Si rien ne fonctionne, vérifiez que vous avez bien activé la gestion des erreurs par exceptions !
  4. Modifier le code pour qu'il affiche la miniature de l'image à côté de chaque titre.
  5. (Optionnel) Ajouter un peu de CSS pour que la liste ressemble plus à une galerie.
  6. On va maintenant faire un script permettant d'avoir une page pour chaque image. Pour commencer, ajouter à chaque image un lien vers image.php?id=34 (avec à la place de 34 l'identifiant de l'image).
  7. Créer le script image.php, qui affiche toutes les infos sur l'image dont l'identifiant a été passé en paramètre : titre, miniature, lien vers la page Flickr de l'image, date, et nom de l'auteur avec un lien vers sa galerie Flickr.
  8. Que se passe-t-il si vous allez sur la page d'URL « image.php?id=1; DROP TABLE images; -- » ? Si ce n'est déjà fait, protégez votre BD contre les injections SQL en utilisant uniquement des requêtes préparées.

Optionnel, pour les rapides

Faire en sorte qu'il soit possible de contrôler quelles images sont affichées dans la galerie avec un paramètre ordre, qui modifie l'ordre d'affichage (chronologique, chronologique inverse, ou alphabétique) et des paramètres de filtrage comme avant et apres (une certaine date) ou auteur, par exemple.

Exercice 2 — Architecture d’un site simple #

Une proposition de correction de cet exercice est disponible : première partie (archive), deuxième partie (archive).'

Récupérer cette archive. Elle contient un répertoire poemes, qui lui-même contient

  • un répertoire textes, avec les textes de quatre poèmes
  • un répertoire images, avec les images des poètes
  • un fichier donnees.php, qui déclare un tableau contenant des informations sur les poèmes (auteur, titre, image correspondante)

Le but de l'exercice est de réaliser un site présentant ces quatre poèmes. Un site plus conséquent utiliserait évidemment une base de données ; un des objectifs est de vous faire manipuler les tableaux PHP, et de vous faire travailler sur l'architecture d'un site indépendamment des problèmes spécifiques aux BD (connexion, erreurs de requêtes, etc.).

Pour simplifier l'énoncé et l'exercice, on va utiliser un paramètre d'URL pour choisir le poème à afficher. Ce choix vous semble-t-il pertinent ?

Première partie : un site fonctionnel

  1. Placer le répertoire poemes sur le serveur, et créer un fichier index.php dans le répertoire. Mettre un modèle de page HTML de base dans le fichier index.php. Dans toute cette partie, on ne modifiera que ce fichier index.php.
  2. Inclure le fichier donnees.php depuis le fichier index.php. On va ainsi pouvoir accéder aux informations sur les poèmes.
  3. Afficher une liste des titres des poèmes.
  4. Récupérer le paramètre poeme dans l'URL, et si sa valeur correspond à l'une des quatre clefs (boheme, correspondances, bois, automne), alors on va afficher la page du poème correspondant : pour l'instant, afficher le titre du poème comme titre principal de la page (h1) et dans l'élément title de l'en-tête HTML.
  5. Ajouter à la page le texte du poème correspondant, et le nom de l'auteur en-dessous.
  6. Ajouter l'image correspondante, avec comme texte alternatif le nom de l'auteur.
  7. Transformer la liste des titres de poèmes en une liste de liens : un clic sur un poème mène à la « page » correspondante.
  8. Faire en sorte que s'il n'y pas de paramètre poeme dans l'URL, un message d'accueil soit affiché.
  9. Faire en sorte que si la valeur du paramètre poeme dans l'URL est erronée, un message d'erreur soit affiché.

Deuxième partie : une meilleure architecture

À ce niveau-là, le mini-site doit fonctionner correctement. Il n'est cependant pas très propre, car on a mélangé la logique et l'affichage. Pour bien faire, il faut séparer notre fichier en deux morceaux.

  • index.php va être le contrôleur, il ne s'occupera que d'analyser l'URL pour déterminer le poème désiré et récupérer les informations correspondantes dans les données. Il ne devra rien afficher lui-même : une fois son travail terminé, il se contentera d'inclure l'autre fichier.
  • On va créer un fichier squelette.php, qui au contraire ne s'occupera que de l'affichage. Il contiendra une page HTML « à trous » (on parle de template) : on n'utilisera PHP que pour afficher des variables. Les variables seront remplies au préalable par le contrôleur.

Créer un squelette pour les pages affichant un poème, et modifier index.php pour qu'il se comporte comme un contrôleur tel que décrit ci-dessus.

Créer un squelette pour les autres pages (accueil et erreur) si nécessaire, et adapter index.php.

Pour les rapides : compléments (optionnels)

Ajouter un système de recherche, en essayant de garder une architecture propre. Dans un premier temps, l'internaute doit pouvoir retrouver un poème à partir du nom de l'auteur. Ensuite la recherche doit pouvoir porter sur le texte des poèmes.

Si vous estimez que vos squelettes partagent trop de code HTML, n'hésitez pas à extraire des fragments communs, qui seront inclus depuis plusieurs squelettes (l'exemple typique est le pied de page).