Ce TP correspond à la deuxième partie du cours de PHP. Il concerne la génération de pages Web en lien avec des bases de données. Le but de ce TP est de faire un site Web permettant la gestion des prix nobels décernés entre 1901 et 2010.
Remarque : Le site Web sera développé en anglais puisque les données contenues dans la base de données sont en anglais. Cependant, il n’est pas nécessaire de parler l’anglais couramment…
Exercice 1 : Création de la base de données
Connectez-vous sur votre compte postgreSQL et exécutez ce script SQL. Ce script, une fois exécuté, crée les tables nobels
et categories
. La table categories
contient les différentes catégories de prix nobels (chimie, paix, etc) et la table nobels
contient les informations sur les différents prix nobels reçus entre 1901 et 2010.
-
En regardant le début du script SQL, déterminer combien il existe de clés primaires et de clés étrangères.
-
Exécuter la requête SQL suivante et vérifier qu’il y a 839 prix nobels dans la base de données.
SELECT count(*) FROM nobels;
Rappels :
-
Commande pour se connecter à postgreSQL :
psql -h aquabdd -d etudiants
-
Commande pour exécuter un script SQL (dans l’invite de commandes de postgreSQL) : ` \i nom_script`
Exercice 2 : Affichage du nombre de prix nobels
Créer un script nbpn.php
qui affiche le nombre de prix nobels dans la base de données.
Informations pour se connecter à la base de données :
- Host : aquabdd
- Driver : pgsql
- Nom de la base : etudiants
- Login : numéro étudiant
- Mot de passe : code INE
Exercice 3 : Affichage des 25 derniers prix nobels
-
Créer un script
last.php
qui affiche les nom et prénom, catégorie et année des 25 derniers prix nobels sous forme d’une table HTML (un prix nobel par ligne).Requête SQL :
SELECT * FROM nobels ORDER BY year DESC LIMIT 25
Le script doit utiliser la méthode
fetch
(dans une bouclewhile
) pour récupérer les résultats. -
Créer une deuxième version du script qui utilise la méthode
fetchAll
pour récupérer les résultats.
Exercice 4 : Affichage des informations d’un prix nobel
Créer un script infos.php
qui affiche les informations d’un prix nobel dont l’identifiant est passé en paramètre dans l’url. Les informations seront affichées sous la forme d’une liste non ordonnée. S’il n’y a aucun identifiant en paramètre, le script doit afficher le message Aucun identifiant. Si l’identifiant ne correspond à aucun prix nobel, le script doit afficher Identifiant invalide.
Requête SQL pour récupérer les informations du prix nobel d’identifiant 1 :
Select * from nobels WHERE id = 1
Exercice 5 : Création de la classe Model
-
Créer le fichier
Model.php
et définir la classeModel
. Définir le constructeur permettant la connexion à la base de données. Il faudra indiquer que les données envoyées sont en utf-8 et que le mode d’erreur est la levée d’exceptions. La classe devra implémenter le design pattern singleton.Rappels :
- Host :
aquabdd
- Driver :
pgsql
- Nom de la base :
etudiants
- Login :
numéro étudiant
- Mot de passe :
code INE
- Host :
-
Définir la méthode
get_last()
retournant les 25 derniers prix nobels décernés dans un tableau PHP.Requête SQL :
SELECT * FROM nobels ORDER BY year DESC LIMIT 25
-
Définir la méthode
get_nb_nobel_prizes()
retournant le nombre total de prix nobels dans la base de données.Requête SQL :
SELECT count(*) FROM nobels
Exercice 6 : Page d’accueil du site
Télécharger cette archive, la décompresser et ajouter le fichier Model.php
dans le répertoire PrixNobel
. En utilisant le modèle, modifier la page home.php
pour afficher le nombre de prix nobels dans la base de données à la place de TO FILL.
Exercice 7 : Affichage des 25 derniers prix nobels
Définir le script last25.php
qui affiche sous forme d’une table HTML les nom et prénom, la catégorie et l’année des 25 derniers prix nobels décernés. La page doit ressembler à ceci. Le script utilisera la classe Model
pour récupérer les informations sur les prix nobels.
Remarque : Ce script doit donc afficher la même table HTML que le script last.php
mais en utilisant la classe Model
(et le code CSS).
Exercice 8 : Informations concernant un prix nobel
-
Définir la méthode
get_nobel_prize_informations()
prenant en paramètre un entier et retournant un tableau contenant toutes les informations du prix nobel dont l’identifiant est égal à cet entier oufalse
s’il n’existe pas. -
Définir le script
informations.php
. Ce dernier teste s’il existe dans l’url un paramètreid
. Si ce dernier existe et correspond à un nombre entier strictement positif, il affiche toutes les informations du prix nobels correspondant s’il existe ou un message indiquant qu’il n’existe aucun prix nobel ayant cet identifiant dans la base de données. -
Modifier le script
last25.php
pour que les noms et prénoms de chaque prix nobel soit un lien hypertexte sur le fichierinformations.php
contenant les informations de ce prix nobel.
Exercice 9 : Formulaire d’ajout d’un prix nobel
-
Définir la méthode
get_categories()
retournant un tableau de chaînes de caractères correspondant aux différentes catégories de prix nobels. -
Dans le fichier
form_add.php
, définir un formulaire pour ajouter un prix nobel dans la base de données. Ce formulaire doit ressembler à ceci. La soumission du formulaire appellera le scriptadd.php
. Les boutons radio doivent être générés en fonction des catégories présentes dans la base de données.
Exercice 10 : Ajout d’un prix nobel
-
Définir la méthode
add_nobel_prize()
dans la classeModel
. Cette méthode prend en paramètre un tableau$infos
contenant les clésyear
,category
,name
,birthdate
,birthplace
,county
etmotivation
; elle ajoute dans la base de données un prix nobel avec les informations contenues dans$infos
.Requête SQL permettant d’ajouter le prix nobel de la paix 2019 dans la base de données.
INSERT INTO nobels (year, category, name, birthdate, birthplace, county, motivation) VALUES (2019, "peace", "Abiy Ahmed", 1976, "Agarao", "Ethiopia", "Abiy was awarded the 2019 Nobel Peace Prize for his work in ending the 20-year post-war territorial stalemate between Ethiopia and Eritrea.")
- Définir la fonction
check_data()
. Cette fonction vérifie si :$_POST["name"]
est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,$_POST["category"]
est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,$_POST["year"]
est défini et correspond à un nombre entier strictement positif.
Si l’une de ces conditions n’est pas vérifiée, la fonction retourne
false
. Autrement, la fonction retourne le tableau$infos
créé à partir des informations contenues dans$_POST
. Si certaines valeurs sont manquantes ou incorrectes (chaîne vide ou constituée uniquement d’espaces, valeur non entière pour la date, etc), elle met la valeurnull
. - Définir le script
add.php
qui vérifie si le formulaire a été soumis. Si c’est le cas, il essaie d’ajouter un prix nobel dans la base de données. Dans tous les cas, il affiche un message pour indiquer si un prix nobel a été ajouté, s’il y a eu une erreur ou si aucun formulaire n’a été soumis.
Exercice 11 : Suppression d’un prix nobel
-
Ajouter la méthode
remove_nobel_prize()
dans la classeModel
. Cette méthode prend en paramètre un entier correspondant à un identifiant de prix nobel et supprime le prix nobel associé dans la base de données.Requête SQL permettant de supprimer le prix nobel d’identifiant 1 :
DELETE FROM nobels WHERE id = 1
-
Définir le script
remove.php
. Ce script détermine s’il existe un paramètreid
dans l’url correspondant à un entier. Dans ce cas, il détermine si ce paramètre est l’identifiant d’un prix nobel. Il supprime le prix nobel de la base le cas échéant.Dans tous les cas, le script affiche l’un des trois messages suivants :
- There is no id in the url.
- There is no nobel prize with such id.
- The nobel prize has been removed.
-
Modifier le script
last25.php
de manière à afficher à côté de chaque prix nobel l’image. Pour cela, ajouter une colonne dans la table HTML. Les cases de cette colonne devront appartenir à la classe
sansBordure
. La baliseimg
devra appartenir à la classeicone
.Faire en sorte que lors du clic sur l’une des images, le prix nobel associé soit supprimé par appel du script
remove.php
.
Exercice 12 : Modification d’un prix nobel
-
Ajouter la méthode
updateNobelPrize
dans la classeModel
. Cette méthode prend en paramètre un tableau contenant les clés'id'
,'year'
,'category'
,'name'
,'birthdate'
,'birthplace'
,'county'
et'motivation'
. La méthode doit mettre à jour toutes les informations du prix nobel d’identifiantid
avec les autres valeurs du tableau.Requête SQL modifiant le prix nobel d’identifiant 1 pour qu’il corresponde au prix nobel de la paix 2019.
UPDATE nobels SET year = 2019, category = "peace", name = "Abiy Ahmed", birthdate = 1976, birthplace = "Agarao", county = "Ethiopia", motivation = "Abiy was awarded the 2019 Nobel Peace Prize for his work in ending the 20-year post-war territorial stalemate between Ethiopia and Eritrea." WHERE id = 1
-
Définir le script
form_update.php
. Ce script détermine s’il existe un paramètre dans l’url de nomid
et s’il correspond à l’identifiant d’un prix nobel dans la base de données. Si c’est le cas, le script affiche le formulaire de modification des informations du prix nobel. Les informations du prix nobel devront être affichées comme valeur par défaut des différents champs de saisie. Dans le cas contraire, le script affichera un message d’erreur.Attention : l’identifiant sera transmis comme un paramètre caché.
Remarque : La méthode sera la méthode
post
. Le script appelé lors de la soumission seraupdate.php
. - Définir le script
update.php
qui modifie les informations du prix nobel. Les modifications ne seront faites que si$_POST["Id"]
est défini et correspond à un nombre entier strictement positif,$_POST["Name"]
est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,$_POST["Category"]
est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,$_POST["Year"]
est défini et correspond à un nombre entier strictement positif.
Si certaines valeurs ne sont pas précisées, la valeur par défaut est
null
. Dans tous les cas, le script affiche un message pour indiquer si la base de données a été mise à jour. - Modifier le script
last25.php
afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classesansBordure
. Chaque case contiendra l’imagecorrespondant à un lien hypertexte sur le script
form_update.php
. La baliseimg
devra appartenir à la classeicone
.
Exercice 13 : Pagination de l’affichage de tous les prix nobels
Le but de cet exercice est d’afficher tous les prix nobels de la base de données. Vu le nombre, cet affichage sera paginé, avec 25 prix nobels affichés sur chaque page (L’affichage des prix nobels sera similaire à l’affichage des résultats de différents moteurs de recherche).
Cet affichage se fera via le script list_all.php
. Ce script affichera une page de prix nobels. Le numéro de la page devra être donné dans l’url par le paramètre page
. Si la base de données contient 80 prix nobels, les urls affichant les résultats devront être :
- http://localhost/~num_etudiant/list_all.php?page=1
- http://localhost/~num_etudiant/list_all.php?page=2
- http://localhost/~num_etudiant/list_all.php?page=3
- http://localhost/~num_etudiant/list_all.php?page=4
-
Définir la méthode
get_nobel_prizes_with_limit($offset, $limit)
retournant un tableau contenant les$limit
prix nobels de la base à partir du numéro$offset
.Requête SQL pour afficher du 51ème au 75ème prix nobel (dans l’ordre décroissant des années d’attribution des prix nobels) :
Select * from nobels ORDER BY year DESC LIMIT 25 OFFSET 50
Remarque : Les prix nobels seront ordonnés selon l’ordre décroissant des dates d’attribution des prix nobels. Ainsi,
get_nobel_prizes_with_limit(0,25)
retournera le même tableau que la méthodeget_last()
. -
Créer le script
list_all.php
. Celui-ci vérifie qu’il existe dans l’url un paramètre de nompage
correspondant à un entier strictement positif (Si ce n’est pas le cas, il prend la valeur 1). Il affiche alors la page de prix nobels correspondante ou un message d’erreur si cette page n’existe pas.Remarque : L’affichage des 25 prix nobels de la page doit être similaire à celui du script
last25.php
. Il est intéressant de créer un scriptlist_table.php
qui, étant donné un tableau PHP de prix nobels, affiche ce tableau sous la forme d’une table HTML. Ce script est alors inclus dans les scriptslast25.php
etlist_all.php
pour afficher les prix nobels. -
Ajouter dans la vue les liens des différentes pages (comme pour le moteur de recherche google) sous la liste des 25 prix nobels affichés. Si la page affichée est la page de résultats numéro 5, alors la liste doit ressembler à ceci.
Remarque : Voici les liens sur les images des flèches gauche et droite.
Exercice 14 : Recherche dans la base de données
-
Ajouter dans la classe
Model
la méthodesearch_nobel_prizes($filters, $offest, $limit)
. Cette méthode permet de rechercher les prix nobels selon certains critères. Pour cela, la méthode prend en paramètre un tableau$filters
.-
Si le tableau
$filters
contient la cléName
, alors le nom du prix nobel doit contenir la chaîne$filters["Name"]
comme sous-chaîne (conditionLIKE
en SQL). -
Si le tableau
$filters
contient les clésYear
etSignYear
, et si$filters["SignYear"]
est égal à<=
,>=
, ou==
, alors l’année d’attribution du prix nobel doit être inférieure ou égale, supérieure ou égale ou égale à l’année$filters["Year"]
.
La méthode prend également en paramètre deux entiers
$offset
et$limit
et retourne une partie des résultats en fonction de$offset
et$limit
(pagination des résultats).Remarque : La méthode
search_nobel_prizes($filters, $offest, $limit)
doit retourner les mêmes résultats queget_nobel_prizes_with_limit($offest, $limit)
si le tableau$filters
est vide. -
- Définir le script
form_search.php
qui affiche un formulaire de recherche. Celui-ci doit contenir :- un champ de type texte pour rechercher selon le nom,
- un champ de type
select
pour choisir parmi>=
,<=
ou==
, - un champ de type texte pour entrer un année. Ce champ et le précédent doivent permettre d’effectuer une recherche selon l’année d’attribution du prix nobel.
Le formulaire doit ressembler à :
-
Définir le script
search.php
. Celui-ci affiche les résultats de la recherche avec pagination. Pour cela, il détermine si le formulaire de recherche a été soumis. Si c’est le cas, il sauvegarde dans la variable$_SESSION
les paramètres de la recherche. Il détermine ensuite s’il existe dans l’url un paramètre de nompage
et affiche la page de résultats correspondante. Dans le cas contraire, il affiche la première page de résultats de la recherche. - Modifier le code pour permettre de chercher également selon les catégories (0, 1 ou plusieurs catégories peuvent être utilisées dans la recherche).
Lorsque tous les exercices de ce TP sont compris et terminés, vous pouvez faire les exercices de révision du deuxième chapitre.