Code PHP pour publier : processus
Six blocs sont nécessaires pour afficher des données extraites d'une base de données X à partir d'une requête Y :
Connexion à la base de données X
Définition d'une requête Y
Exécution de la requête Y
Affichage des résultats de la requête Y
Fermeture de la requête Y
Fermeture de la connexion à la base de données X
Ainsi, par comparaison aux blocs nécessaires pour enregistrer des données dans une base de données, on ne retrouve qu'un nouveau bloc, soit celui de l'affichage des résultats (bloc 4). Nous n'insisterons que sur ce dernier, les autres demeurant très similaires.
Lorsque l'on débute dans le développement de pages permettant de publier du contenu dynamiquement, il peut être utile de systématiser le processus de préparation des pages en le découpant en 4 étapes :
No de l'étape | Objectif de l'étape | Correspondance aux blocs | Commentaires |
---|---|---|---|
1 | Préparer la requête SQL pour extraire les données à publier ainsi que les instructions PHP correspondantes pour l'exécuter | Blocs 1, 2, 3 | Il faut ici réfléchir aux données dont nous aurons besoin pour l'affichage. Il faut y inclure tout ce qui est nécessaire, mais seulement ce qui est nécessaire. Le défi ici est plus souvent sur le plan SQL que PHP. |
2 | Préparer le code HTML et PHP pour afficher une ligne de la table des résultats | Bloc 4 | On pourrait se demander pourquoi on ne se concentre que sur une seule ligne de la table des résultats. Il faut se rappeler que la table des résultats est lue de manière linéaire, ligne après ligne. Ainsi, si on comprend comment afficher les résultats d'une ligne, il sera facile de répéter par la suite pour les autres lignes. Il faut décider du type d'affichage désiré pour les données : en paragraphe? en tableau? dans une liste à puces? Une fois ce choix fait, il faut préparer le code HTML en conséquence. Ne pensez à ce moment-ci qu'en HTML avec les données fixes provenant d'une ligne de la table des résultats. Lorsque l'on débute, il est plus facile de procéder ainsi. Par la suite, repérez dans le code HTML les données dynamiques (celles qui changeront à chacune des lignes de la table des résultats) et remplacez-les par les instructions PHP correspondantes. |
3 | Identifier dans le code créé les éléments qui se répéteront pour chaque ligne de la table des résultats et les encadrer par les instructions PHP permettant de parcourir la table des résultats | Bloc 4 | Il faut cibler maintenant ce qu'il est nécessaire, dans notre code HTML et PHP, de répéter pour chacune des lignes de la table des résultats. Par exemple, si on décide d'afficher le résultat sous forme d'une liste à puces, nous voudrons répéter pour chacune des lignes l'élément LI, mais nous ne voudrons pas le faire pour l'élément OL ou UL. Il faut ajouter dans le code les instructions PHP pour que ces éléments soient répétés pour chacune des lignes de la table (boucle WHILE). |
4 | Insérer le code PHP pour fermer la requête et la connexion à la BD | Blocs 5, 6 | Finalement, il ne restera qu'à préparer les instructions PHP pour fermer tant la requête que la connexion à la BD. |
Deux exemples seront maintenant présentés pour illustrer ce processus.
Exemple : Affichage de données sous forme d'un paragraphe
Soit la base de données INSCRIP. Imaginons que nous aimerions faire afficher pour chacun des cours, dans un paragraphe, son horaire et son statut de cette manière :
« Le cours optionnel 2001 Histoire 101 se donne le 1e jour de la semaine, à 09:00:00 heure. »
Pour mieux visualiser le résultat, vous pouvez consulter la page à l'URL https://cours.ebsi.umontreal.ca/sci6306/demo_c12/info_cours.php.
Reprenons une à une les étapes préalablement proposées.
ÉTAPE 1
Objectif de l'étape : Préparer la requête SQL pour extraire les données à publier ainsi que les instructions PHP correspondantes
Résultat :
La requête SQL devra aller chercher les champs STATUT, NO_COURS, TITRE, JOUR et HEURE de la table COURS :
SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;
Cette requête viendra s'inscrire dans le bloc 2, le bloc 1 visant à établir la connexion et le bloc 3, à exécuter la requête :
//Bloc 1
include "App_Data/ouverture_bd.php";
//Bloc2
$req_cours = $bdd->prepare('SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;');
//Bloc 3
$req_cours->execute();
Remarquez ici la forme de l'instruction execute
. Comme on ne retrouve aucune variable dans la requête SQL, il n'y a pas à passer en arguments/paramètres les valeurs de ces dernières comme nous avions à le faire pour l'enregistrement des données. C'est ce qui explique qu'on ne retrouve rien entre les parenthèses.
Une fois ces trois lignes exécutées, nous aurons mis en mémoire, dans la variable $req_cours,
la table de résultats retournée par la requête SQL. Par la suite, nous pourrons aller chercher une ligne à la fois avec la variable $donnees
qui contiendra tous les champs pour cette ligne que nous pourrons cibler individuellement avec la syntaxe $donnees['statut']
où statut
est le nom de la colonne dans la requête SQL (détails plus tard à l'étape 3).
ÉTAPE 2
Objectif de l'étape : Préparer le code HTML et PHP pour afficher une ligne de la table des résultats
Résultat :
Le code HTML nécessaire pour afficher la première ligne du tableau, si on le pense statique et non dynamique, serait le suivant :
<p>Le cours optionnel <strong>20001 Histoire 101</strong> se donne le 1<sup>e</sup> jour de la semaine, à 09:00:00 heure.</p>
Ainsi, si on veut généraliser ce code à toutes les lignes (donc le penser dynamique; les commentaires représentent les éléments dynamiques génériques) :
<p>Le cours <!-- statut --> <strong><!-- no_cours titre --></strong> se donne le <!-- jour --><sup>e</sup> jour de la semaine, à <!-- heure --> heure.</p>
Finalement, la "dynamisation" en PHP donnerait le code suivant :
<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>
Ce qu'il faut comprendre ici, c'est que chacun des éléments dynamiques nécessitera un morceau de code PHP pour l'afficher, donc une instruction echo
. De plus, il faudra bien nommer ces éléments, par exemple $donnees['statut']
.
ÉTAPE 3
Objectif de l'étape : Identifier dans le code créé les éléments qui se répéteront pour chaque ligne de la table des résultats et les encadrer par les instructions PHP permettant de parcourir la table des résultats
Résultat :
Comme nous voulons obtenir un paragraphe par ligne, tout le code <p>...</p>
sera répété pour chacune des lignes de la table des résultats. Il faudra ainsi l'inscrire dans une boucle (WHILE
) qui permettra de parcourir une à la suite de l'autre toutes les lignes de la table des résultats :
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>
}
La condition de la boucle WHILE
peut se comprendre ainsi : on verse (instruction fetch
) dans la variable $donnees
une ligne de la table de résultats (cette table ayant été mise à l'étape 1 dans la variable $req_cours
) et on exécute les instructions qui se retrouvent dans la boucle (soit l'affichage du paragraphe avec les données de la ligne mise en mémoire). On continue tant qu'il reste des lignes dans la table de résultats (chaque passage dans la boucle va chercher la ligne suivante). La boucle s'arrête lorsqu'il n'y a plus de lignes non traitées dans la table des résultats.
ÉTAPE 4
Objectif de l'étape : Insérer le code PHP pour fermer la requête et la connexion à la BD
Résultat :
Les instructions PHP pour fermer la requête et la connexion à la BD sont les mêmes que pour l'enregistrement de données :
$req_cours->closeCursor();
$bdd=null;
Ainsi, au final, la publication en paragraphe des informations sur les cours nécessitera le code suivant :
//Bloc 1
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 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>
}
//Bloc 5
$req_cours->closeCursor();
//Bloc 6
$bdd=null;
Rappel : Il faut faire attention à bien identifier les moments où l'on "parle PHP" en les encadrant par les balises d'ouverture et de fermeture PHP, soit <?php
et ?>
.
Exemple : Affichage de données sous forme d'une liste à puces
Soit la base de données INSCRIP. Imaginons que nous aimerions cette fois faire afficher la liste des étudiant.e.s inscrit.e.s à des cours sous forme d'une liste à puces comme suit :
Bretécher, Claire (10002)
Asimov, Isaac (10004)
Pour mieux visualiser le résultat, vous pouvez le consulter à l'URL https://cours.ebsi.umontreal.ca/sci6306/demo_c12/liste_etudiants.php.
Reprenons à nouveau les différentes étapes.
ÉTAPE 1
Objectif de l'étape : Préparer la requête SQL pour extraire les données à publier ainsi que les instructions PHP correspondantes
Résultat :
La requête SQL devra aller chercher les champs NO_ETUD et NOM de la table ETUD en vérifiant que les étudiant.e.s sont bien inscrit.e.s à un cours (table SUIT) :
SELECT DISTINCT etud.no_etud, nom FROM etud, suit WHERE etud.no_etud=suit.no_etud ORDER BY etud.no_etud;
Les blocs 1, 2 et 3 deviendront ainsi :
//Bloc 1
include "App_Data/ouverture_bd.php";
//Bloc 2
$req_etud = $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_etud->execute();
ÉTAPE 2
Objectif de l'étape : Préparer le code HTML et PHP pour afficher une ligne de la table des résultats
Résultat :
Le code HTML statique nécessaire pour afficher la première puce, serait le suivant :
<ul>
<li>Bretécher, Claire (10002)</li>
</ul>
Ainsi, si on veut généraliser ce code à toutes les lignes (donc le penser dynamique; les commentaires représentent les éléments dynamiques génériques) :
<ul>
<li><!-- nom --> (<!-- no_etud -->)</li>
</ul>
Finalement, la "dynamisation" en PHP donnerait le code suivant :
<ul>
<li> echo $donnees['nom']; ( echo $donnees['no_etud']; )</li>
</ul>
ÉTAPE 3
Objectif de l'étape : Identifier dans le code créé les éléments qui se répéteront pour chaque ligne de la table des résultats et les encadrer par les instructions PHP permettant de parcourir la table des résultats
Résultat :
Ce que nous voudrons répéter pour toutes les lignes est uniquement l'élément LI et son contenu. Les balises d'ouverture et de fermeture de la liste à puces (UL) ne devraient pas se retrouver dans la boucle sinon elles seront démultipliées :
<ul>
while ($donnees = $req_etud->fetch())
{
<li> echo $donnees['nom']; ( echo $donnees['no_etud']; )</li>
}
</ul>
ÉTAPE 4
Objectif de l'étape : Insérer le code PHP pour fermer la requête et la BD
Résultat :
Les instructions PHP pour fermer la requête et la BD sont les mêmes que pour l'enregistrement de données :
$req_etud->closeCursor();
$bdd=null;
Ainsi, au final, la publication en liste à puces des informations sur les étudiant.e.s inscrit.e.s à un cours nécessitera le code suivant :
//Bloc 1
include "App_Data/ouverture_bd.php";
//Bloc 2
$req_etud = $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_etud->execute();
//Bloc 4
<ul>
while ($donnees = $req_etud->fetch())
{
<li> echo $donnees['nom']; ( echo $donnees['no_etud']; )</li>
}
</ul>
//Bloc 5
$req_etud->closeCursor();
//Bloc 6
$bdd=null;