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 :

  1. Connexion à 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 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 :

Processus pour la préparation du code PHP pour publier des données

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.

ExempleAffichage 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 :

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

1
//Bloc 1
2
include "App_Data/ouverture_bd.php";
3
4
//Bloc2
5
$req_cours = $bdd->prepare('SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;');
6
7
//Bloc 3
8
$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']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 :

1
<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) :

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

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

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 :

1
<?php
2
while ($donnees = $req_cours->fetch())
3
{
4
?>
5
   <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>
6
<?php
7
}
8
?>

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 :

1
$req_cours->closeCursor();
2
$bdd=null;

Ainsi, au final, la publication en paragraphe des informations sur les cours nécessitera le code suivant :

1
<?php
2
    //Bloc 1
3
    include "App_Data/ouverture_bd.php";
4
    
5
    //Bloc 2
6
    $req_cours = $bdd->prepare('SELECT no_cours, titre, jour, heure, statut FROM cours ORDER BY no_cours;');
7
    
8
    //Bloc 3
9
    $req_cours->execute();
10
    
11
    //Bloc 4
12
    while ($donnees = $req_cours->fetch())
13
    {
14
?>
15
16
    <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>
17
18
<?php
19
    }
20
    //Bloc 5
21
    $req_cours->closeCursor();
22
    
23
    //Bloc 6
24
    $bdd=null;
25
?>

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

ExempleAffichage 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) :

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

1
//Bloc 1
2
include "App_Data/ouverture_bd.php";
3
4
//Bloc 2
5
$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;');
6
7
//Bloc 3
8
$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 :

1
<ul>
2
   <li>Bretécher, Claire (10002)</li>
3
</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) :

1
<ul>
2
   <li><!-- nom --> (<!-- no_etud -->)</li>
3
</ul>

Finalement, la "dynamisation" en PHP donnerait le code suivant :

1
<ul>
2
   <li><?php echo $donnees['nom'];?> (<?php echo $donnees['no_etud'];?>)</li>
3
</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 :

1
<ul>
2
  <?php
3
  while ($donnees = $req_etud->fetch())
4
  {
5
  ?>
6
    <li><?php echo $donnees['nom'];?> (<?php echo $donnees['no_etud'];?>)</li>
7
  <?php
8
  }
9
  ?>
10
</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 :

1
$req_etud->closeCursor();
2
$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 :

1
<?php
2
    //Bloc 1
3
    include "App_Data/ouverture_bd.php";
4
    
5
    //Bloc 2
6
    $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;');
7
    
8
    //Bloc 3
9
    $req_etud->execute();
10
11
    //Bloc 4
12
?>
13
14
    <ul>
15
        <?php
16
        while ($donnees = $req_etud->fetch())
17
        {
18
        ?>
19
           <li><?php echo $donnees['nom'];?> (<?php echo $donnees['no_etud'];?>)</li>
20
        <?php
21
        }
22
        ?>
23
    </ul>
24
25
<?php
26
    //Bloc 5
27
    $req_etud->closeCursor();
28
29
    //Bloc 6
30
    $bdd=null;
31
?>