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