Code source du fichier pages-doc/php.html

<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&nbsp;:<br>
      <pre>
&lt;html&gt;
&lt;head&gt;
    ....
&lt;/head&gt;
&lt;body&gt;
    &lt;br/&gt;
    &lt;br/&gt;
    &lt;p align="center" style="font-size:200%"&gt;
        Nous sommes le
        &lt;?php
            echo date ("j/m/Y", time ());
        ?&gt;
        et il est
        &lt;?php
            echo date ("g:i:s", time ());
        ?&gt;
    &lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
      </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&nbsp;:<br>
      <pre>
&lt;html&gt;
&lt;head&gt;
    ....
&lt;/head&gt;
&lt;body&gt;
    &lt;br/&gt;
    &lt;br/&gt;
    &lt;p align="center" style="font-size:200%"&gt;
        Nous sommes le XXXJOUR
        et il est
        XXXHEURE
    &lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
      </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&nbsp;:<br>
      <pre>
&lt;?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";
?&gt;
      </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&nbsp;:<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&nbsp;:<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&nbsp;:<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>