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.

  1. En regardant le début du script SQL, déterminer combien il existe de clés primaires et de clés étrangères.

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

  1. 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 boucle while) pour récupérer les résultats.

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

  1. Créer le fichier Model.php et définir la classe Model. 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
  2. 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
    
  3. 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

  1. 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 ou false s’il n’existe pas.

  2. Définir le script informations.php. Ce dernier teste s’il existe dans l’url un paramètre id. 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.

  3. Modifier le script last25.php pour que les noms et prénoms de chaque prix nobel soit un lien hypertexte sur le fichier informations.php contenant les informations de ce prix nobel.

Exercice 9 : Formulaire d’ajout d’un prix nobel

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

  2. 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 script add.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

  1. Définir la méthode add_nobel_prize() dans la classe Model. Cette méthode prend en paramètre un tableau $infos contenant les clés year, category, name, birthdate, birthplace, county et motivation ; 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.")
    
  2. 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 valeur null.

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

  1. Ajouter la méthode remove_nobel_prize() dans la classe Model. 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
    
  2. Définir le script remove.php. Ce script détermine s’il existe un paramètre id 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.
  3. 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 balise img devra appartenir à la classe icone.

    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

  1. Ajouter la méthode updateNobelPrize dans la classe Model. 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’identifiant id 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
    
  2. Définir le script form_update.php. Ce script détermine s’il existe un paramètre dans l’url de nom id 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 sera update.php.

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

  4. Modifier le script last25.php afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classe sansBordure. Chaque case contiendra l’image correspondant à un lien hypertexte sur le script form_update.php. La balise img devra appartenir à la classe icone.

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
  1. 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éthode get_last().

  2. Créer le script list_all.php. Celui-ci vérifie qu’il existe dans l’url un paramètre de nom page 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 script list_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 scripts last25.php et list_all.php pour afficher les prix nobels.

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

    Liens

    Remarque : Voici les liens sur les images des flèches gauche et droite.

Exercice 14 : Recherche dans la base de données

  1. Ajouter dans la classe Model la méthode search_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 (condition LIKE en SQL).

    • Si le tableau $filters contient les clés Year et SignYear, 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 que get_nobel_prizes_with_limit($offest, $limit) si le tableau $filters est vide.

  2. 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 à :

    Formulaire de recherche

  3. 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 nom page et affiche la page de résultats correspondante. Dans le cas contraire, il affiche la première page de résultats de la recherche.

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