<html>
<head>
<title>Phpcovid : Programmation en PHP</title>
<meta name=author content="Bernard Chardonneau">
<meta name=copyleft content="Logiciel et données publiés dans le domaine public">
<meta name=robots content="noindex,follow">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/misenpage.css" rel="stylesheet" type="text/css">
<link href="css/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="contenu">
<h1>Programmation en PHP</h1>
Le langage PHP est un langage de programmation qui permet de demander
au serveur de générer du texte dans la page HTML ou d'effectuer d'autres
traitements.<br>
<br>
<h2>Première approche : PHP et HTML mélangés</h2>
Une première approche consiste à insérer des zones de code PHP dans une
page HTML comme dans l'exemple suivant :<br>
<pre>
<html>
<head>
....
</head>
<body>
<br/>
<br/>
<p align="center" style="font-size:200%">
Nous sommes le
<?php
echo date ("j/m/Y", time ());
?>
et il est
<?php
echo date ("g:i:s", time ());
?>
</p>
</body>
</html>
</pre>
Ici, la page HTML ne contient presque rien et les traitements en PHP sont
simples. De plus le 2ème traitement en PHP n'a pas besoin d'exploiter les
résultats du premier traitement. Enfin, c'est toujours la même page qu'on
va afficher. Lorsqu'il y a des interations avec les utilisateurs via un
formulaire, ou lorsque des erreur qui nécessitent un traitement spécial
peuvent apparaitre, ce n'est plus le cas.<br>
<br>
Aussi, il est préférable de disssocier le modèle de page en HTML et le code
PHP qui sera dans un fichier distinct.<br>
<br>
<h2>Deuxième approche : PHP et HTML dans des fichiers distincts</h2>
Pour l'exemple précédent, le fichier HTML va devenir quelque-chose comme
ceci :<br>
<pre>
<html>
<head>
....
</head>
<body>
<br/>
<br/>
<p align="center" style="font-size:200%">
Nous sommes le XXXJOUR
et il est
XXXHEURE
</p>
</body>
</html>
</pre>
Ce fichier est enregistré sous le nom <tt>date-et-heure.html</tt> dans
le répertoire <tt>pages</tt> qui contient tous les modèles de pages du
site.<br>
<br>
Un fichier PHP distinct de nom <tt>date-et-heure.php</tt> aura le contenu
suivant :<br>
<pre>
<?php
<font color="#0040FF">// fonctions d'affichage de portions de pages HTML</font>
require ("acces_page.php");
<font color="#0040FF">// modèle de page html</font>
$ficpage = "pages/date-et-heure.html";
<font color="#0040FF">// ouvrir en lecture le fichier contenant le modèle de page à afficher</font>
$descfic = fopen ($ficpage, "r");
<font color="#0040FF">// si l'ouverture s'est bien passée</font>
if ($descfic)
{
<font color="#0040FF">// récupérer la date courante</font>
$jour = date ("j/m/Y", time ());
<font color="#0040FF">// recopier le début du fichier html jusqu'à la ligne contenant</font>
<font color="#0040FF">// XXXJOUR que l'on remplacera par le contenu de la variable $jour</font>
copmaj ($descfic, "XXXJOUR", $jour);
<font color="#0040FF">// recopier la suite du fichier html jusqu'à la ligne contenant XXXHEURE exclue</font>
copie_jusque_chaine ($descfic, "XXXHEURE");
<font color="#0040FF">// générer une ligne (bien indentée) contenant l'heure</font>
echo " ".date ("g:i:s", time ());
<font color="#0040FF">// recopier la fin du fichier html</font>
copie_jusque_fin ($descfic);
<font color="#0040FF">// terminé avec le fichier html, on ferme le fichier</font>
fclose ($descfic);
}
<font color="#0040FF">// sinon message d'erreur</font>
else
echo "Page date-et-heure.html manquante";
?>
</pre>
Le travail du programme PHP consiste à envoyer au navigateur le modèle
de fichier HTML en s'arrêtant à certains endroits indentifiés par une
chaine de caractères qui commence par XXX pour faire un traitement
particulier.<br>
<br>
Afin de montrer les différentes possibilités, l'affichage de la date et
de l'heure sont traités différemment par le programme PHP :<br>
<ul>
<li>Pour la date, on utilise une fonction qui remplace dans la
première ligne où on la trouve, une chaine de caractères (ici
XXXJOUR) par un autre contenu qui est fabriqué en PHP,</li>
<br>
<li>Pour l'heure, on envoie au navigateur la suite du fichier HTML
jusqu'à la ligne où on trouve une autre chaine de caractères
(ici XXXHEURE).<br>
En général, et c'est le cas ici, la ligne contenant XXXHEURE
n'est pas envoyée, mais un 3<sup>e</sup> paramètre pour la
fonction <tt>copie_jusque_chaine</tt> permet de demander
qu'elle le soit.<br>
Ensuite, le programme PHP rajoute ce qui est nécessaire (ici
l'heure).</li>
</ul>
Pour faire ces traitement, le programme PHP appelle des fonctions du
fichier <a href="voirsource.php?page=acces_page.php">acces_page.php</a> .
Ce genre de fichier peut être utilisé à l'identique pour tous les sites
web en PHP.<br>
<br>
Chacune des fonctions de <tt>acces_page.php</tt> continue de lire le
fichier HTML à partir de la ligne qui suit celle où s'était arrêté
l'appel de la fonction précédente.<br>
<br>
Lorsqu'on n'a plus de traitement particulier à faire, la fonction
<tt>copie_jusque_fin</tt> permet d'envoyer au navigateur le reste du
fichier HTML.<br>
<br>
L'utilisation d'un fichier HTML et d'un fichier PHP distincts permet
de dissocier l'aspect et le contenu global de la page (partie fixe
spécifiée dans le fichier HTML) des parties variables qui sont générées
en PHP.<br>
<br>
<h2>Exemple avec plusieurs fichiers HTML pour un fichier PHP</h2>
Il arrive, tout particulièrement si on traite les données issues de
l'envoi d'un formulaire, que plusieurs fichiers HTML soient souhaitables
pour traiter les différents cas.<br>
<br>
C'est ce qui se passe avec les fichiers <tt>table-evol-age.php</tt>,
<tt>table-evol-reg.php</tt> et <tt>table-evol-dom.php</tt>. Une table
pour chaque classe d'âge, chaque région, ou chaque département d'outre-mer
montrant l'évolution de la vaccination tous les 10 jours entraînerait
une page HTML très longue. On demande donc à l"utilisateur de sélectionner
une classe d'âge, ou une région, ou un DOM particulier avant d'afficher
la table correspond à ce qu'il a choisi.<br>
Deux modèles de page HTML sont utilisés, le premier lorsqu'aucune table
n'a encore été sélectionnée, l'autre lorsque c'est fait.<br>
<br>
Cela donne pour <tt>table-evol-age.php</tt> le code PHP suivant :<br>
<pre>
<font color="#0040FF">// récupérer la classe d'âge sélectionnée</font>
$cl_age = $_POST ['cl_age'];
<font color="#0040FF">// modèle de page html (dépend si classe d'âge déjà sélectionnée ou non)</font>
if ($cl_age)
$ficpage = DIR_PAGES."/table-evol-age.html";
else
$ficpage = DIR_PAGES."/table-evol-select-age.html";
<font color="#0040FF">// ouvrir le fichier contenant la page à afficher</font>
$descfic = fopen ($ficpage, "r");
...
</pre>
<h2>Autre exemple : vérification d'un formulaire</h2>
Dans ce deuxième exemple, on utilise un formulaire pour inscrire de
nouveaux utilisateurs à un service.<br>
<br>
Le fichier HTML du formulaire est le suivant :<br>
<br>
<iframe src="vsource-ifr.php?page=exemples-code/demande_compte.html" width="700"
height="500"></iframe><br>
<br>
La demande de création d'un compte n'est autorisée que si l'on n'est pas
connecté au site.<br>
<br>
Le programme PHP commence par récupérer les données du formulaire en
normalisant certains d'entre eux au niveau des majuscules et minuscules.<br>
<br>
<iframe src="vsource-ifr.php?page=exemples-code/demande_compte1.php" width="600"
height="220"></iframe><br>
<br>
Une fois qu'on a cliqué sur le bouton permettant de le valider, le programme
PHP vérifie si tous les champs requis sont présents avec un contenu
syntaxique adapté à leur rôle. Celà peut entraîner la détection d'erreurs.
Dans ce cas, on s'arrête à la première erreur rencontrée qui est mémorisée.<br>
<br>
<iframe src="vsource-ifr.php?page=exemples-code/demande_compte2.php" width="600"
height="500"></iframe><br>
<br>
Si aucune erreur n'a été détectée, on peut créer le compte.<br>
La création du compte peut entraîner d'autres erreurs parmi lesquelles
celle où le nom de compte choisi est déjà utilisé.<br>
<br>
Si tout s'est bien passé jusque là, on n'aura pas à afficher de nouveau le
formulaire. Une autre page indiquera que la compte a été créé.<br>
<br>
Jusqu'à présent, on n'a fait que traiter les données du formulaire.
Maintenant, on va s'occuper de la page HTML à afficher.<br>
<br>
<iframe src="vsource-ifr.php?page=exemples-code/demande_compte3.php" width="600"
height="500"></iframe><br>
<br>
Les traitements à faire dépendent du modèle de page HTML à afficher.<br>
<br>
Dans le cas où c'est le formulaire de saisie qui doit être affiché, il
peut être affiché pour la première fois ou au contraire de nouveau affiché
parce qu'un champ saisi est absent ou syntaxiquement incorrect.<br>
<br>
La série d'appels de la fonction <tt>copmaj</tt> permet de conserver dans
les champs du formulaire la valeur introduite précédemment, pour éviter de
demander de tout resaisir. Et l'erreur s'affiche en rouge en bas de page.<br>
<br>
La première fois que le formulaire est affiché, aucun champ n'a encore
été saisi et l'appel des fonctions <tt>copmaj</tt> va mettre une valeur
initiale vide pour les différents champs du formulaire.<br>
Quant à l'endroit où il est prévu de mettre les messages d'erreur, le
programme PHP le saute sans rien y écrire.<br>
<br>
</div>
<div id="menu">
XXXMENU
</div>
</body>
</html>