É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
SCI6306 2/19 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
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) Côté Client Côté Serveur Base de données
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
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
SCI6306 6/19 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
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 Exemple {Bloc d'instructions facultatif si la condition est fausse} à exécuter 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)
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
SCI6306 9/19 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
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
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) Étape 2 (BLOC 4) Préparer le code HTML pour afficher une ligne de la table des résultats Table de résultats PRENOM Jean Hop NOM Peupu Lavie Traitement de la table de résultats Mais pourquoi??? Rappel : une table de résultats est lue de manière linéaire, ligne par ligne! Page Web résultante Étape 3 (BLOC 4) Identifier les éléments HTML qui se répéteront pour chaque ligne de la table des résultats 1. Ligne 1 Jean 2. Ligne 2 Hop Peupu Lavie Voici la liste des répondants : Répondant : Jean Peupu Répondant : Hop Lavie Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes)
SCI6306 12 /19 Étape 2 : Code PHP Code PHP pour publier : processus [2/5] Exemple (INSCRIP) : je veux faire afficher pour chacun des cours, dans un paragraphe, son horaire et son statut : Le cours optionnel 2001 Histoire 101 se donne le 1 e 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) SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours; NO_ TITRE JOUR HEURE STATUT COURS 20001 Histoire 101 1 09:00:00 optionnel 20002 Éthique 302 1 13:00:00 obligatoire É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 Forme spécifique (pour la première ligne) <p>le cours optionnel <strong>20001 Histoire 101</strong> se donne le 1 e 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 jour e jour de la semaine, à heure heure.</p> DÉBUT BOUCLE <p>le cours statut <strong>no_cours titre</strong> se donne le jour e jour de la semaine, à heure heure.</p> FIN BOUCLE Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes) 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
SCI6306 13 /19 Code PHP pour publier : processus [3/5] echo $donnees['statut']; echo $donnees['titre']; <p>le cours statut <strong>no_cours titre</strong> se echo $donnees['no_cours']; donne le jour e jour de la semaine, à heure heure.</p> echo $donnees['jour']; echo $donnees['heure']; Résultat final <p>le cours echo $donnees['statut']; <strong> echo $donnees['no_cours']; echo $donnees['titre'];</strong> se donne le echo $donnees['jour'];<sup>e</sup> jour de la semaine, à echo $donnees['heure']; heure.</p> Code PHP pour la ligne générique
SCI6306 14 /19 Code PHP pour publier : processus [4/5] while ($donnees = $req_cours->fetch()) { <p>le cours echo $donnees['statut']; <strong> echo $donnees['no_cours']; echo $donnees['titre'];</strong> se donne le echo $donnees['jour'];<sup>e</sup> jour de la semaine, à echo $donnees['heure'];.</p> } Code PHP pour la boucle
SCI6306 15 /19 Code PHP pour publier : processus [5/5] Blocs Bloc 1 PHP include "App_Data/ouverture_bd.php"; Bloc 2 Bloc 3 Bloc 4 Bloc 5 $req_cours = $bdd->prepare('select no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;'); $req_cours->execute(); while ($donnees = $req_cours->fetch()) { <p>le cours echo $donnees['statut']; <strong> echo $donnees['no_cours']; echo $donnees['titre'];</strong> se donne le echo $donnees['jour'];e jour de la semaine, à echo $donnees['heure'];.</p> } $req_cours->closecursor(); Bloc 6 $bdd=null; Code PHP pour l'ensemble des blocs
SCI6306 16 /19 Code PHP pour publier : autre exemple [1/3] Exemple (INSCRIP) : je veux produire la liste des étudiants inscrits à un cours : Bretécher, Claire (10002) Asimov, Isaac (10004) É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 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> NO_ETUD NOM 10002 Bretécher, Claire 10004 Asimov, Isaac Étape 4 (BLOCS 4, 5, 6) Insérer le code PHP (acétates suivantes) 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
SCI6306 17 /19 Code PHP pour publier : autre exemple [2/3] <ul> while ($donnees = $req_etudiant->fetch()) { <li> echo $donnees['nom']; ( echo $donnees['no_etud'];)</li> } </ul> Code PHP pour la ligne générique et pour la boucle
SCI6306 18 /19 Code PHP pour publier : autre exemple [3/3] Blocs Bloc 1 PHP include "App_Data/ouverture_bd.php"; Bloc 2 Bloc 3 Bloc 4 Bloc 5 Bloc 6 $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;'); $req_etudiant->execute(); <ul> while ($donnees = $req_etudiant->fetch()) { <li> echo $donnees['nom']; ( echo $donnees['no_etud'];)</li> } </ul> $req_etudiant->closecursor(); $bdd=null; Code PHP pour l'ensemble des blocs
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