École de bibliothéconomie et des sciences de l’information SCI6306 Bases de données documentaires Cours 12 Publication dynamique de contenu d'une base de données sur le Web avec PHP Faculté des arts et des sciences 25 novembre 2016 © Christine Dufour, 2016 1 /19 25 novembre 2016 SCI6306 Au programme aujourd’hui Publication Web Processus Fichier PHP pour publication Code PHP pour publier : blocs, processus et exemples Exercices Note : les deux prochains (et derniers) cours se feront en laboratoire 2 /19 25 novembre 2016 SCI6306 3 /19 Processus pour la publication Web Balises HTML et codes PHP entremêlés pour générer le contenu : . Balises HTML pour les éléments fixes . Codes PHP pour les éléments dynamiques Page HTML Fichier PHP (publication) Données structurées en champs dans une(des) table(s) Base de données Côté Client Côté Serveur 25 novembre 2016 SCI6306 4 /19 Fichier PHP pour publication Web Différent de celui pour l'enregistrement (saisie) Enregistrement : requêtes INSERT INTO, UPDATE ou DELETE pour manipuler les données (ajout, modification, suppression) d’une base de données Publication : requêtes SELECT pour extraire des données d’une base de données Ce qui peut être publié Tout ce que l'on peut générer par une requête SQL : une donnée ou une table de données Formatage des données (en texte, en tableau, en liste à puces, etc.) fait par le biais du HTML 25 novembre 2016 SCI6306 5 /19 Code PHP pour publier : Blocs 6 blocs pour afficher des données extraites d’une base de données X à partir d’une requête Y 1. Connexion avec la base de données X 2. Définition d'une requête Y 3. Exécution de la requête Y 4. Affichage des résultats de la requête Y 5. Fermeture de la requête Y 6. Fermeture de la base de données X 25 novembre 2016 SCI6306 Structures algorithmiques de base Structures logiques (conditionnelles) Aiguillage simple (SI … ALORS … SINON) Aiguillage complexe (CHOIX MULTIPLES) Structures répétitives (boucles) Nombre de cycles inconnus (TANT QUE) Nombre de cycles prédéterminés (POUR) Utiles tant pour la saisie via Web que pour la publication Structures qui existent dans tous les langages procéduraux 6 /19 25 novembre 2016 SCI6306 7 /19 Structures algorithmiques de base SI … ALORS … SINON (aiguillage simple) Fonctionnement Exécute minimalement un bloc d'instructions si la condition est vraie; Peut aussi inclure un bloc d'instructions si la condition est fausse Structure générique (forme complète en PHP*) IF (condition) {Bloc d'instructions à exécuter si la condition est vraie} ELSE {Bloc d'instructions – facultatif – à exécuter si la condition est fausse} Exemple Pour vérifier la valeur d'un contrôle et définir des actions différentes en fonction de cette valeur * Rappel forme compacte pour affichage : (condition?élément retourné si vrai:élément retourné si faux) 25 novembre 2016 SCI6306 8 /19 Structures algorithmiques de base CHOIX MULTIPLES (aiguillage complexe) Fonctionnement Exécute différents blocs d'instructions en fonction des valeurs prises par une variable. Structure générique (PHP) SWITCH (variable) { CASE valeur1: Bloc d'instructions à exécuter si variable = valeur1; break; […] DEFAULT: Bloc d'instructions à exécuter si variable = autres valeurs; } Exemple Pour personnaliser l'affichage des données en fonction des différentes valeurs prises par un champ. Note : pourrait aussi se faire par une série de IF imbriqués mais cela devient rapidement compliqué lorsqu'il y a plusieurs valeurs à tester. Exemple : http://dufour.ebsi.umontreal.ca/algo/condition.php Page PHP : http://cours.ebsi.umontreal.ca/sci6306/docs/sci6306_c12_condition.pdf 25 novembre 2016 SCI6306 Structures algorithmiques de base TANT QUE (boucle avec répétitions inconnues) Fonctionnement Exécute un bloc d'instructions tant que la condition demeure vraie Structure générique (PHP) WHILE (condition) {Bloc d'instructions à exécuter} Exemple Particulièrement utile pour passer à travers les enregistrements dans une table de résultats retournée par une requête SQL 9 /19 25 novembre 2016 SCI6306 10 /19 Structures algorithmiques de base POUR (boucle avec répétitions connues) Fonctionnement Exécute un bloc d'instructions de manière répétitive, à l'intérieur d'une boucle allant d'une valeur de départ à une valeur de fin. Structure générique (PHP) FOR (valeur de départ; valeur de fin; valeur de l'incrémentation) {Bloc d'instructions à exécuter} Exemple Autre manière pour passer à travers l’ensemble des enregistrements dans une table de résultats retournés par une requête SQL lorsque l'on connait le nombre de lignes que l'on veut. Exemple : http://dufour.ebsi.umontreal.ca/algo/repetition.php Page PHP : http://cours.ebsi.umontreal.ca/sci6306/docs/sci6306_c12_repetition.pdf 25 novembre 2016 SCI6306 11 /19 Code PHP pour publier : processus [1/5] Étape 1 (BLOCS 1, 2, 3) Préparer la requête SQL (visualiser la table de résultats) Mais pourquoi ??? Table de résultats PRENOM Jean Hop Étape 2 (BLOC 4) Préparer le code HTML pour afficher une ligne de la table des résultats Étape 3 (BLOC 4) Identifier les éléments HTML qui se répéteront pour chaque ligne de la table des résultats Traitement de la table de résultats Jean Rappel : une table de résultats est lue de manière linéaire, ligne par ligne! Page Web résultante Voici la liste des répondants : 1. Ligne 1 Peupu • Répondant : Jean Peupu Lavie • Répondant : Hop Lavie 2. Ligne 2 Hop Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes) NOM Peupu Lavie 25 novembre 2016 SCI6306 12 /19 Étape 2 : Code PHP Code PHP pour publier : processus [2/5] Exemple (INSCRIP) : je veux faire afficher pour chacun Le cours optionnel 2001 Histoire 101 se donne des cours, dans un paragraphe, son horaire et son statut : le 1e jour de la semaine, à 09:00:00 heure. Étape 1 (BLOCS 1, 2, 3) Préparer la requête SQL (visualiser la table de résultats) Étape 2 (BLOC 4) Préparer le code HTML pour afficher une ligne de la table des résultats Étape 3 (BLOC 4) Identifier les éléments HTML qui se répéteront pour chaque ligne de la table des résultats Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes) NO_ SELECT no_cours, titre, COURS jour, heure, statut FROM 20001 cours ORDER BY no_cours; 20002 TITRE JOUR HEURE STATUT Histoire 101 Éthique 302 1 1 09:00:00 13:00:00 optionnel obligatoire Forme spécifique (pour la première ligne) <p>Le cours optionnel <strong>20001 Histoire 101</strong> se donne le 1e jour de la semaine, à 09:00:00 heure.</p> Forme générique (pour toutes les lignes; italique = données dynamiques) <p>Le cours statut <strong>no_cours titre</strong> se donne le joure jour de la semaine, à heure heure.</p> DÉBUT BOUCLE <p>Le cours statut <strong>no_cours titre</strong> se donne le joure jour de la semaine, à heure heure.</p> FIN BOUCLE 1. Code PHP pour la ligne de résultat générique 2. Code PHP pour la boucle 3. Code PHP pour l'ensemble des blocs 25 novembre 2016 SCI6306 13 /19 Code PHP pour publier : processus [3/5] <?php echo $donnees['statut'];?> <?php echo $donnees['titre'];?> <p>Le cours statut <strong>no_cours titre</strong> se <?php echo $donnees['no_cours'];?> donne le joure jour de la semaine, à heure heure.</p> <?php echo $donnees['jour'];?> <?php echo $donnees['heure'];?> Résultat final <p>Le cours <?php echo $donnees['statut'];?> <strong><?php echo $donnees['no_cours'];?> <?php echo $donnees['titre'];?></strong> se donne le <?php echo $donnees['jour'];?><sup>e</sup> jour de la semaine, à <?php echo $donnees['heure'];?> heure.</p> Code PHP pour la ligne générique 25 novembre 2016 SCI6306 14 /19 Code PHP pour publier : processus [4/5] <?php while ($donnees = $req_cours->fetch()) { ?> <p>Le cours <?php echo $donnees['statut'];?> <strong><?php echo $donnees['no_cours'];?> <?php echo $donnees['titre'];?></strong> se donne le <?php echo $donnees['jour'];?><sup>e</sup> jour de la semaine, à <?php echo $donnees['heure'];?>.</p> <?php } ?> Code PHP pour la boucle 25 novembre 2016 SCI6306 15 /19 Code PHP pour publier : processus [5/5] Blocs PHP Bloc 1 <?php include "App_Data/ouverture_bd.php"; Bloc 2 $req_cours = $bdd->prepare('SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;'); Bloc 3 $req_cours->execute(); Bloc 4 while ($donnees = $req_cours->fetch()) { ?> <p>Le cours <?php echo $donnees['statut'];?> <strong><?php echo $donnees['no_cours'];?> <?php echo $donnees['titre'];?></strong> se donne le <?php echo $donnees['jour'];?>e jour de la semaine, à <?php echo $donnees['heure'];?>.</p> <?php } Bloc 5 $req_cours->closeCursor(); Bloc 6 $bdd=null; ?> Code PHP pour l'ensemble des blocs 25 novembre 2016 SCI6306 16 /19 Code PHP pour publier : autre exemple [1/3] Exemple (INSCRIP) : je veux produire la liste des étudiants inscrits à un cours : Étape 1 (BLOCS 1, 2, 3) Préparer la requête SQL (visualiser la table de résultats) Étape 2 (BLOC 4) Préparer le code HTML pour afficher une ligne de la table des résultats Étape 3 (BLOC 4) Identifier les éléments HTML qui se répéteront pour chaque ligne de la table des résultats Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes) • Bretécher, Claire (10002) • Asimov, Isaac (10004) SELECT DISTINCT etud.no_etud, nom FROM etud, suit WHERE etud.no_etud=suit.no_etud ORDER BY etud.no_etud; Forme spécifique (pour la première ligne) <ul> <li>Bretécher, Claire (10002)</li> </ul> Forme générique (pour toutes les lignes) <ul> <li>nom (no_etud)</li> </ul> <ul> DÉBUT BOUCLE <li>nom (no_etud)</li> FIN BOUCLE </ul> 1. Code PHP pour la ligne de résultat générique 2. Code PHP pour la boucle 3. Code PHP pour l'ensemble des blocs NO_ETUD 10002 10004 NOM Bretécher, Claire Asimov, Isaac 25 novembre 2016 SCI6306 17 /19 Code PHP pour publier : autre exemple [2/3] <ul> <?php while ($donnees = $req_etudiant->fetch()) { ?> <li><?php echo $donnees['nom'];?> (<?php echo $donnees['no_etud'];?>)</li> <?php } ?> </ul> Code PHP pour la ligne générique et pour la boucle 25 novembre 2016 SCI6306 18 /19 Code PHP pour publier : autre exemple [3/3] Blocs PHP Bloc 1 <?php include "App_Data/ouverture_bd.php"; Bloc 2 $req_etudiant = $bdd->prepare('SELECT DISTINCT etud.no_etud, nom FROM etud, suit WHERE etud.no_etud=suit.no_etud ORDER BY etud.no_etud;'); Bloc 3 $req_etudiant->execute(); ?> Bloc 4 <ul> <?php while ($donnees = $req_etudiant->fetch()) { ?> <li><?php echo $donnees['nom'];?> (<?php echo $donnees['no_etud'];?>)</li> <?php } ?> </ul> Bloc 5 Bloc 6 <?php $req_etudiant->closeCursor(); $bdd=null; ?> Code PHP pour l'ensemble des blocs 25 novembre 2016 SCI6306 19 /19 Exercices collectifs en classe Exercice 1 : Refaire le processus pour un autre besoin (production d'un tableau présentant la moyenne obtenue par cours) Exercice 2 : Examiner des fichiers PHP pour la publication Web pour comprendre à quoi ils servent