gilles.hunault@univ-angers.fr                                        

 

Un petit tuteur PHP -- a small PHP tutorial

 

Valid XHTML 1.0!                  

Table des matières

          il y a aussi une version PostScript pour impression.
          un tuteur MYSQL est disponible ici pourla partie interface base de données.
          vous pouvez tester ici ces programmes en temps réel ;
          voulez-vous voir un tour de cartes en php ?

1.  Présentation de PHP

2.  Eléments du langage de PHP

    2.1 Commentaires, variables, affectations etc.

    2.2 Tests et Boucles

    2.3 Sous-programmes

3.  Programmation classique en PHP

    3.1 Exemple 1 : un Bonjour complet

    3.2 Exemple 2 : Table de multiplication

    3.3 Exemple 3 : Calcul de moyennes de classe

4.  Exemples spécifiques en PHP

    4.1 Nombre de fichiers dans une répertoire

    4.2 Requêtes MYSQL simples

    4.3 Requêtes PHP/MYSQL plus sophistiquées

5.  Exemples plus techniques en PHP

    5.1 Dictionnaires d'un fichier texte

    5.2 Classification hiérarchique de données bactériologiques

    5.3 Identification automatique de vecteurs d'absence-présence

    5.4 Graphiques avec jpgraph

    5.5 Production de pdf avec ezpdf

 


 

1.  Présentation de PHP

PHP est un langage de programmation pour les serveurs Web, orienté base de données. Ce qui signifie qu'il permet de gérer des pages HTML dynamiques et en particulier de construire des pages Web correspondant à des résultats de requêtes sur des bases SQL. Selon ses auteurs, sa syntaxe est proche du C, de Java et de Perl. PHP se compose d'un langage de programmation classique (affectations, boucles...), de fonctions Web et de fonctions base de données. Nous décrivons ici l'utilisation de la version 3 de PHP, désignée aussi sous la référence PHP3. Ce tuteur est largement inspiré de la documentation officielle.

PHP s'exécute sur le serveur et non pas sur le client (navigateur) c'est pourquoi on ne voit que le résultat de l'exécution du programme php à l'aide d'un navigateur.

Si vous connaissez déjà Perl, vous pouvez profiter du tableau synoptique des instructions Perl et Php.

PHP est disponible sous Windows et sous Unix. Le site officiel est

http://www.php.net

PHP est aussi livré en standard avec le serveur Apache et l'interpréteur Php dans les distributions EasyPHP, Wamp, Xampp. et surtout Zmws ( mps mps).

Pour utiliser PHP, une fois le logiciel installé, configuré il suffit d'écrire des fichiers de type .php plutôt que .htm ou .html et le tour est joué (lire la note locale sur les serveurs angevins).

L'appel à PHP est commencé par le marqueur <? et se termine par le marqueur ?>. On peut aussi utiliser le marqueur <?php comme indicateur de début de script php.

Il faut noter que dans la version 3 dés le premier appel à PHP, le serveur Web gère une "session" PHP qui garde en mémoire un certain nombre d'informations, comme par exemple les variables PHP mais ce n'est plus le cas avec la version 4 et certains scripts sont donc à modifier...

Le fichier suivant, nommé xmp01.php3


    <html>
      <head>
         <title> (gH) : un premier exemple en PHP</title>
      </head>
      <body>
         Bonjour, <? echo " tout le monde " ;?>
      </body>
    </html>

est une page Web qui utilise le mode normal pour afficher "Bonjour"
et qui fait appel à PHP pour afficher " tout le monde ".

Attention ! l'imbrication des marqueurs Web classiques et ceux de PHP n'a pas besoin d'être "équilibrée" tant que cela donne un page correcte.

Par exemple, le fichier xmp02.php3 qui contient


    <html>
      <head>
         <title> (gH) : deuxième exemple en PHP</title>
      </head>
      <body>
        <ul>
          <li> Un</li>
          <? echo "<li>Deux </li>" ;
             echo "</ul>" ;
          ?>
      </body>
    </html>

est correct, alors que le marqueur <? commence avant que le marqueur </ul> termine la liste (ce qui est normal, ici, puisque c'est PHP qui termine la liste).

On peut ouvrir et fermer PHP plusieurs fois dans une même page, comme


    <html><head>
    <? echo " <title>troisième exemple</title> " ; ?></head>
    <body><ul><li> Un </li>
    <? echo "<li>Deux </li>" ;
       echo "</ul>" ;
    ?>
    </body></html>

En termes de sécurité, PHP est intéressant car c'est le serveur qui interprète la page. L'utilisateur ne voit que la page produite. Ainsi, la demande de l'affichage du texte source de la page précédente donne


    <html>
      <head>
         <title>troisième exemple</title>
      </head>
      <body>
         <ul>
         <li> Un  </li>
         <li>Deux </li>
         </ul>
      </body>
    </html>

comme si toute le texte avait été écrit "normalement".

2.  Eléments du langage de PHP

2.1  Commentaires, variables, affectations etc.

Un commentaire peut être délimité par /* et */ ou suivre le symbole # ou le symbole double //.

Une variable est repérée par le symbole $ et l'affectation se fait avec =. Par exemple $jmois = 0 met la valeur 0 dans la variable jmois. PHP n'est pas typé explicitement, ce qui signifie qu'on n'a pas besoin de préciser le type d'une variable. En interne, PHP utilise les types integer, float, string, array et object.

Les variables chaines de caractères utilisent les deux jeux de délimiteurs ' et " ainsi que les séquences escape comme \n, \$... Lorsque le délimiteur " est utilisé, les variables à l'intérieur sont interpolées, c'est à dire remplacées par leur contenu.

$i = 2 ;
echo " \$i vaut $i " ;   # affiche $i vaut 2
echo " \\\$i vaut \$i " ;   # affiche \$i vaut $i

Les instructions PHP doivent être terminées par des points-virgules.

Un tableau en PHP est une variable qui utilise des crochets avec une valeur (indice) entre les crochets. L'indice peut être quelconque, ce qui fournit à la fois les tableaux classiques (indice numérique) et les "hashs" ou tableaux associatifs (indice chaine de caractères). Ainsi $age["pierre"] = 12 ; met 12 dans le tableau age à l'indice pierre.

La fonction count() renvoie le nombre d'éléments dans le tableau et on accède aux différents éléments du tableau avec each() ou à partir de next() et prev(). Les tableaux peuvent être triés avec sort(), asort(), arsort(), ksort()...

Certains tableaux sont créés dynamiquement. Ainsi explode(char,chaine) renvoie un tableau où chaque élément correspondant au découpage de la chaine, char étant le séparateur. Par exemple

explode(" ; "," il pleut ; je mange ; tu dors ") ;

renvoie un tableau a trois éléments dont le premier (situé à l'indice zéro) est il pleut. Si on utilise plus d'un indice, on met des crochets autour de chaque indice. Ainsi l'élémént traditionnel Mi,j d'une matrice se note $M[$i][$j] en PHP.

En ce qui concerne les variables, il faut noter que toute variable d'un formulaire produit une variable de même nom pour PHP. Par exemple le formulaire


   <form action=...>
   Id : <input type="text"   name="nom" /><br>
        <input type="submit" value="envoi" />
   </form>

renvoie automatiquement une variable $nom qui contient ce que l'utilisateur a entré dans le champ texte correspondant.

Enfin, les variables d'environnement sont considérées comme des variables PHP normales, même si la fonction getenv() donne accès aux variables systèmes.

Lors de l'affectation, PHP permet de nombreux raccourcis à la C, comme

     $a = ++$b =$c; 

ce que nous ne conseillons pas pour des questions de lisibilité.

L'opérateur % renvoie le reste de la division entière (ou "modulo"). La concaténation de chaine se fait avec un . et $a = $a . $b peut se raccourcir en $a .= $b . Les opérateurs logiques ont les "doux" noms and , or , xor , ! (not) et les opérateurs de comparaison sont standards : == , <= , >= .

Pour les habitués au C et à Perl, il est possible d'utiliser la construction $a ? $b : $c ; comme raccourci pour l'affection classique if $a then $b else $c.

2.2  Tests et Boucles

Le test en Si se fait avec if (condition) { ... } . On peut utiliser else pour l'alternative inverse et elseif pour des alternatives multiples. L'instruction switch est également disponible pour les structures de cas générales.

La boucle Tant que utilise while (condition) { ... } . La forme do {...} while (condition) réalise la boucle répéter... jusqu'à puisqu'elle effectue le test en fin de cours de boucle.

La boucle pour classique en PHP est for (debut;fin;increment) { ...} .

2.3  Sous-programmes

Un sous-programme en PHP est forcément une fonction, déclarée par

   function Nom (liste d'Arguments) { ... ; } 

La valeur renvoyée éventuellement doit être spécifiée par return . Pour envoyer des valeurs multiples, il faut soit convertir le tout en chaine de caractères, soit renvoyer un tableau explicite comme return array ($i, $j) .

Les arguments d'une fonction sont facultatifs. Le passage par référence plutôt que par valeur se fait en rajoutant & soit dans l'en-tête de la fonction soit au moment de l'appel. Si l'argument est suivi de = valeur, il s'agit d'une valeur constante, qui sera prise par défaut.

3.  Programmation classique en PHP

3.1  Exemple 1 : un Bonjour complet

Rappelons que ce premier programme doit afficher le mot "Bonjour" puis demander à l'utilisateur son prénom et lui dire au revoir, en affichant la date, l'heure et le prénom en majuscules. L'affichage du mot Bonjour et la saisie du prénom ne relèvent pas vraiment de PHP, c'est le rôle d'un formulaire HTML. Une version minimale pour cette saisie est


 <html>
      <head>
         <title> (gH) : programme BONJOUR en PHP, partie 1 :
                        formulaire de saisie du prénom </title>
      </head>
      <body>
      <form action="bonjour.php3" method="get" >
      <font color="red">Bonjour</font>.&nbsp;&nbsp;
      Quel est votre nom ? <input type="text" name="prenom" />
      <input type="submit" value=" envoi ! " />
      </form>
      </body>
    </html>

Lorsque l'utilisateur clique sur le bouton "envoi !", la machine transmet l'URL

     http://.../bonjour.php3?prenom=XXX

XXX correspond au texte entré dans le champ du prénom (ou http://.../bonjour.php3?prenom= si le champ est vide). Signalons qu'il est d'ailleurs possible d'entrer directement cette URL "à la main", ce qui permet de tester le programme même sans formulaire, possibilité que nous exploiterons avec le prochain exemple.

Un programme PHP de réponse minimal est


<html>
      <head>
         <title> (gH) : programme BONJOUR en PHP,
                        partie 2 : réponse </title>
      </head>
      <body>
      <?
         if ($prenom=="") { $nom = " bel inconnu " ; }
                     else { $nom = $prenom  ; } ;
         $ladate  = date("d/m/Y") ;
         $lheure  = date("h:i") ;
         $nomMaj  = strtoupper($nom) ;
         echo " Le $ladate à $lheure, au revoir, $nomMaj." ;
      ?>
      </body>
    </html>

mais on préférera sans doute une version plus habillée, avec des <font...>, ce qui est plus du ressort d'HTML que de PHP.

Vous pouvez tester ici ce programme.

3.2  Exemple 2 : Table de multiplication

D'habitude, le programme table de multiplication vient demander un nombre (ou utiliser la valeur passée en paramètre). Ici nous ne ferons pas de formulaire, car nous utiliserons la valeur passée sur la ligne de l'URL (avec un rappel du passage de paramètre si l'URL est entrée telle quelle).


<html>
<head>
   <title> (gH) : programme TABLE (version 1) en PHP </title>
</head>
<?
function aide() {

echo "pour voir la table de N, écrivez au bout de l'URL<br>";
echo "le symbole ? suivi de n=N. Ainsi pour la table de 5,<br>";
echo "à la suite de http://.../table.php3 il faut mettre ?n=5.";

} ; # fin de fonction aide

function tdm($vn) {
    echo " <h1>Table de multiplication de $vn</h1> " ;
    echo "<xmp>" ;
    for ($i=1;$i<=10;$i++) {
        $fi = sprintf("   %3d ",$i) ;
        $fp = sprintf("   %6d ",$i*$vn) ;
        echo "   $fi  fois   $vn   =   $fp\n" ;
    } ; # fin de pour i
    echo " </xmp> " ;
} ; # fin de fonction tdm

?>
<body>
<?
   if ($n=="") { aide()  ; } else { tdm($n) ; } ;
?>
</body>
</html>

Il est possible de passer plusieurs paramètres, par exemple pour gérer la largeur de l'affichage. Le passage de paramètres, commencé par le symbole ? se prolonge par le symbole & suivi d'une expression variable=valeur. C'est ce qui est rappelé dans la fonction aide(). Nous profitons alors du passage de paramètre par défaut de PHP dans l'appel de la fonction tdm.



    <html>
      <head>
         <title> (gH) : exemple MOYENNE en PHP </title>
      </head>

      <?  function aide() { ?>

 pour voir la table de N, écrivez au bout de l'URL<br>
 le symbole ? suivi de n=N. Ainsi pour la table de 5,<br>
 à la suite de http://.../table.php3 il faut mettre ?n=5.<p>

 vous pouvez aussi passer le paramèetre largeur d'affichage ;
 en utilisant & pour séparer les paramètres.<br>
 par exemple http://.../table.php3?n=123456789&largeur=15

      <?   } ; # fin de fonction aide

         function tdm($vn,$larg=6) {
             echo " <h1>Table de multiplication de $vn</h1> " ;
             echo "<xmp>" ;
             for ($i=1;$i<=10;$i++) {
                 $fi = sprintf("   %3d ",$i) ;
                 $fp = sprintf("   %$larg"."d",$i*$vn) ;
                 echo "   $fi  fois $vn   =   $fp\n" ;
             } ; # fin de pour i
             echo " </xmp> " ;
         } ; # fin de fonction tdm

      ?>
      <body>
      <?
         if     ($n=="")       { aide()  ; }
         elseif ($largeur=="") { tdm($n) ; }
         else                  { tdm($n,$largeur) ; } ;
      ?>
      </body>
    </html>

Vous pouvez tester ici ce programme.

3.3  Exemple 3 : Calcul de moyennes de classe

Il s'agit ici de calculer la moyenne de notes lues dans un fichier. Nous allons en fait proposer soit d'entrer les noms et notes dans une zone texte soit d'envoyer le fichier. Nous n'utiliserons qu'un seul fichier nommé moyenne.php3 qui s'appellera lui-même avec divers paramètres. Le programme principal vient seulement choisir le sous-programme à exécuter en fonction du paramétre mode, soit le texte :


if     ($mode=="")                 { saisie()  ;}
elseif ($mode=="saisieFormulaire") { saisieForm();  }
elseif ($mode=="calculFormulaire") { gereCalculs(1,$valeur);}
elseif ($mode=="saisieFichier")    { saisieFic();}
elseif ($mode=="calculFichier")    { gereCalculs(2,"");}
else                               { pbMode();} ;

La saisie est un simple formulaire qui vient relancer le script moyenne.php3 avec le bon paramètre, soit:


 function saisie() {
     debutPageHtml(1," Moyenne, partie 1 : saisie ") ;
?>   <h1>Donnez votre choix :</h1>     <ul>
     <li><a href="moyenne.php3?mode=saisieFormulaire">
         calcul sur texte du formulaire</a></li>
     <li><a href="moyenne.php3?mode=saisieFichier">
         calcul sur fichier-texte</a></li>
     </ul></body></html>
<?   } ; # fin de fonction saisie

debutPageHtml() est une fonction qui gère le document (avec les tags <html>, <body> etc.). Chaque saisie particulière utilise son formulaire HTML :


function saisieForm() {
     debutPagehtml(2," Moyenne, partie 2.1 :
                 saisie sur formulaire " ) ;
?>   <h1>Saisie des valeurs par formulaire</h1>
     <form action="moyenne.php3">
     <input type=hidden name="mode" value="calculFormulaire" />
     <textarea name="valeur" rows=10 cols=35>
          Durand H. * 9 14 12
     </textarea>
     <input type="submit" value ="envoi" /></form></body></html>
<?   } ; # fin de fonction saisieForm

function saisieFic() { global $nomfic, $nomfic_name ;
     debutPageHtml(3," Moyenne, partie 2.2 :
                    calcul sur fichier " ) ;
?>   <form enctype="multipart/form-data" action="moyenne.php3"
                                       method="post">
     <input type="hidden" name="mode" value="calculFichier" />
     <input type="hidden" name="max_file_size" value="1000" />
     <font size="4">
     Indiquez votre fichier  <input type="file" name="nomfic" />
     <input type="submit" value="envoi" /></font>
     </form>
     </body></html>
<?   } ; # fin de fonction saisieFic

La gestion des calculs consiste à appeler le sous-programme calculs avec comme paramètre une chaine de caractère qui contient toutes les valeurs entrées. Dans le cas d'une saisie dans le formulaire, on dispose tout de suite de cette variable. Dans le cas de la saisie sur fichier local, on vient lire le fichier et transférer son contenu dans cette variable. Nous avions convenu pour le format d'entrée de séparer le nom des notes par une étoile (mais pas d'imposer un nombre de notes); La partie calculs vient lire la variable caractère par caractère, remplaçant au passage les sauts de ligne par des espaces et découpe en mots la variable, en affectant là où il faut dès que l'étoile est trouvée. Pour les affichages, nous faisons appel à la même fonction puisque nous trions les tableaux in situ définies comme des variables globales.



<? ## moyenne.php3 (gH) 2000 ; gilles.hunault@univ-angers.fr

function debutPageHtml($num,$titre) {
    echo "<html><head><title>" ;
    echo "$titre" ;
    echo "</title></head><p><body background=beige.jpg>\n" ;
    $fint = explode(" ","red blue blue") ;
    echo "<font color=$fint[$num] size=+4>\n" ;
} ; # fin de fonction debutPageHtml

function afficheNomsNotes($modaf) {

   global $nomElv, $notElv, $moyElv, $nbl, $mpl ;

    $ie = 1 ;
    echo "<blockquote><table>" ;
    while ($ie<=$nbl) {
      echo "<tr><td><font size=6 color=black><b>$nomElv[$ie]
                                             </font></td>" ;
      if ($modaf==0) {
           echo " <td><font size=5 color=#800000> notes
                                             </font></td>" ;
           $in =  1 ;
           while ($in<=$nN) {
             $n = $notElv[$ie][$in]
             echo "<td align=right><font size=5>$n</td>" ;
             $in++; } ; # fin de tant que
      } ; # fin de si sur modaf
      $m =  $moyElv[$ie] ;
      $fm = sprintf("%6.2f",$m) ;
      echo "<td  align=right><font size=5 color=#800000>";
      echo "&nbsp;&nbsp; moyenne &nbsp;&nbsp;</td>" ;
      echo "<td  align=right><font size=6 color=green>" ;
      echo "<b><kbd>$fm</kbd></td>" ;
      $ie++ ;
      echo "</tr>" ;
    } ; # fin de tant que
    echo " </table></blockquote><p>" ;
} ; # fin de fonction afficheNomsNotes

function tri_Alpha($nE,$nN) {
    global $nomElv, $notElv, $moyElv  ;
    $ie = 1 ;
    while ($ie<=$nE-1) {
      $je = 1 + $ie ;
      while ($je<=$nE) {
         $m1 = $nomElv[$ie] ;
         $m2 = $nomElv[$je] ;
         if ($m1>$m2) {  # permutations
            $nomElv[$ie] = $m2 ; $nomElv[$je] = $m1 ;
            $tmp         = $moyElv[$ie] ;
            $moyElv[$ie] = $moyElv[$je] ;
            $moyElv[$je] = $tmp ;
         } ; # fin de tant il faut permuter
         $je++ ; } ; # fin de tant que sur $je
      $ie++ ; } ; # fin de tant que sur $ie
} ; # fin de fonction tri_Alpha($nE,$nN) {

function tri_Moyenne($nE,$nN) {
    global $nomElv, $notElv, $moyElv ;
    $ie = 1 ;
    while ($ie<=$nE-1) {
      $je = 1 + $ie ;
      while ($je<=$nE) {
         $m1 = $moyElv[$ie] ; $m2 = $moyElv[$je] ;
         if ($m1<$m2) {
            # permutations (pas <= à cause des ex-aequo)
            $moyElv[$ie] = $m2 ;  $moyElv[$je] = $m1 ;
            $tmp         = $nomElv[$ie] ;
            $nomElv[$ie] = $nomElv[$je] ;
            $nomElv[$je] = $tmp ;
         } ; # fin de tant il faut permuter
         $je++ ; } ; # fin de tant que sur $je
      $ie++ ; } ; # fin de tant que sur $ie
} ; # fin de fonction tri_Moyen($nE,$nN) {

function affichages_et_FinPageHtml($nE,$nN) {

    echo "<h1>Affichage  historique des $nE élève(s) avec
                           sans doute $nN note(s)</h1>" ;
    afficheNomsNotes(0) ;

    echo "<h1>Affichage par ordre alphabétique</h1>" ;
    tri_Alpha($nE,$nN) ;
    afficheNomsNotes(1) ;

    echo "<h1>Affichage par ordre de mérite</h1>" ;
    tri_Moyenne($nE,$nN) ;
    afficheNomsNotes(1) ;

    # puis on termine la page Html

    echo "</body></html>" ;

} ; # fin de fonction affichages_et_FinPageHtml

  function saisie() {

     debutPageHtml(1," Prog. Moyenne, partie 1 : saisie ") ;

?>   <h1>Donnez votre choix :</h1>
     <ul>
     <li><a href="moyenne.php3?mode=saisieFormulaire">
          calcul sur texte du formulaire</a><p>
     <li><a href="moyenne.php3?mode=saisieFichier">
          calcul sur fichier-texte</a>
     </ul>
     </body></html>

<?   } ; # fin de fonction saisie

function saisieForm() {

     $m = "Prog. Moyenne, partie 2.1 : saisie sur formulaire";
     debutPagehtml(2,$m) ;
?>   <h1>Saisie des valeurs par formulaire</h1>
     <form action="moyenne.php3">
     <input type=hidden   name="mode" value="calculFormulaire">
     <textarea name="valeur" rows=10 cols=35>
          Durand H. * 9 14 12
          Dupon P. * 18 15 11
          Aymar J. * 11 11 11
     </textarea>
     <input type="submit" value ="envoi"></form></body></html>
<?   } ; # fin de fonction saisieForm

function saisieFic() { global $nomfic, $nomfic_name ;

     $m = "Programme Moyenne, partie 2 : calcul sur fichier " ;
     debutPageHtml(3,$m) ;
?>   <form enctype=multipart/form-data action=moyenne.php3
                                       methode=post>
     <input type=hidden   name="mode" value="calculFichier">
     <input type=hidden name=max_file_size value=1000>
     <font size=4>
     Indiquez votre fichier  <input type=file name=nomfic>
     <input type=submit value=envoi></form>
     </font>
     </body></html>

<?   } ; # fin de fonction saisieFic

function calculs($valr) {

   global $nomElv, $notElv, $moyElv, $nbl, $mpl ;

   $valr .= chr(10) ;       # pour forcer la dernière ligne
   $le    = strlen($valr) ; # longueur de la chaine
   $nbl   = 0 ;             # nombre d'élèves
   $mot   = "" ;            # mot courant
   $ic    = 0  ;            # indice du caractère courant

   # format d'entrée : identification  * notes, par exemple
   #  Dupont J. * 12 18

   while ($ic<$le) {

       $lec = substr($valr,$ic,1) ;
       $cec = ord($lec) ;

       if ($cec==42) { # c'est l'étoile

          $nbl++ ; $nomElv[$nbl] = trim($mot) ;
          $lec = "" ; $mot = "" ;

       } elseif ($cec==10) { $lignot = $mot ; # retour charriot

          $tlignot = explode(" ",$lignot) ;
          $cnt = count($tlignot) ;
          $im = 0 ; $nn = 0 ;

          while ($im<$cnt) {
           $motn = trim($tlignot[$im]) ;
           if (strlen($motn)>0) {
              $nn++ ; $notElv[$nbl][$nn] = $motn ;
              $moyElv[$nbl] += $motn ;
            } ; # fin de si strlen($motn)>0
            $im++ ;
          } ; # fin de tant que $im<$cn

          if ($nbl==1) {
              $mpl = $nn ;
          } ; # fin de si $nbl==1
          $moyElv[$nbl] /= $mpl ; $mot  = "" ;
       } elseif ($cec==13) { $lec = "" ;
       } ; # fin de si on voit un retour chariot

       $mot .= $lec ; $ic++ ;

   } ; # fin tant que ic < le

} ; # fin proc function calculs

function gereCalculs($lemode,$lavar) {

   global $nomElv, $notElv, $moyElv, $nbl,
          $mpl, $nomfic, $nomfic_name ;

   if     ($lemode==1) { $valeurs = $lavar ;

          debutPageHtml(1+$lemode,
             " Programme Moyenne, partie 2.2 :
               calcul sur formulaire " ) ; }

   elseif ($lemode==2) {

          debutPageHtml(3,
             " Programme Moyenne, partie 2 :
               calcul sur fichier " ) ;

          # on transfère tout le fichier dans la variable valr

          echo "<font color=black size=4>
               Moyenne des valeurs du fichier
               $nomfic_name<br></font>" ;
          echo '<font color="#800000"blue>
              (fichier '.$nomfic.' sur serveur)</font> ' ;

          $fh  = fopen($nomfic,"r") ;
          $valeurs = "" ;  $nbl = 0 ;
          while (!feof($fh)) {
              $nbl++ ; $lig   = fgets($fh,4096) ;
              $valeurs .= $lig ;
          } ; # fin tant que non fin de fichier

          fclose($fh) ;

   } ; # fin de si sur lemode

   calculs($valeurs) ; affichages_et_FinPageHtml($nbl,$mpl) ;

} ; # fin de fonction gereCalculs

function pbMode() {

   debutPagHtml(0," Programme Moyenne, erreur ! " ) ;
   echo "</body></html>" ;

} ; # fin de fonction pbMode

################################## programme principal

if     ($mode=="")                 { saisie();}
elseif ($mode=="saisieFormulaire") { saisieForm();}
elseif ($mode=="calculFormulaire") { gereCalculs(1,$valeur);}
elseif ($mode=="saisieFichier")    { saisieFic();}
elseif ($mode=="calculFichier")    { gereCalculs(2,"");}
else                               { pbMode();};

?>

Vous pouvez tester ici ce programme.

4.  Exemples spécifiques en PHP

4.1  Nombre de fichiers dans une répertoire

PHP dipose de fonctions systèmes. Par exemple la fonction dir() renvoie une variable (une instance d'objet en fait) de type répertoire. On peut donc lui appliquer la méthode read() et la méthode close(). Comme son nom l'indique, read() permet de lire les entrées du répertoire, y compris . et .. (sous Unix). Plus précisément, read() lit au premier appel la premier entrée du répertoire, puis l'entrée courante dans le répertoire à partir de de la précédente pour les appels suivants, le pointeur de position étant concervé en interne par PHP.

Pour compter le nombre de fichiers dans un répertoire, il suffit d'appeler la fonction dir() en lui passant comme paramètre le nom du répertoire à consulter puis à exécuter une boucle sur l'appel de la fonction read(). Par exemple, sur notre système, nous avons un répertoire Php/ et qui contient deux sous répertoires, Documentation/ et Programmes. Nous avons don écrit une fonction dirstat() et il suffit de lui passer en paramètre le nom d'un répertoire pour obtenir son nombre de fichiers.

Ainsi le code suivant


<? function dirstat($nomdir) {

# calcule le nb de fichiers dans le répertoire

$d  = dir($nomdir) ;
$nbf = 0 ;
 while ($entry=$d->read()) {
    $nbf = $nbf +1 ;
 } ; # fin tant que
 $d->close() ;
 return $nbf-2 ;

} # fin fonction dirstat

$dirbase = "/home/Gh/Info/Cours/Php/" ;
echo "<font size=+5>Comptages sur les fichiers
            du répertoire $dirbase</h1> " ;

$cdir = $dirbase ;
$nbf = dirstat($cdir) ;
echo   "<font size=+5>racine : $nbf fichiers<p>" ;

$ldir = "Documentation/" ;
$cdir = $dirbase.$ldir ;
$nbf  = dirstat($cdir) ;
echo   "<font size=+5>$ldir : $nbf  fichiers<p>" ;

$ldir = "Programmes/" ;
$cdir = $dirbase.$ldir ;
$nbf  = dirstat($cdir) ;
echo   "<font size=+5>$ldir : $nbf   fichiers" ; ?>

pemet d'obtenir de réaliser un comptage et un affichage qui ressemble à :


    Comptages sur les fichiers
       du répertoire /home/Gh/Info/Cours/Php/
    racine : 30 fichiers
    Documentation/ : 17 fichiers
    Programmes/ : 11 fichiers

Vous pouvez tester ici ce programme.

4.2  Requêtes MYSQL simples

PHP a été conçu pou interfacer des bases de données. En plus d'un langage de programmation, c'est donc aussi un langage de requêtes. PHP version 3 sait dialoguer avec


     Adabas D           InterBase          Solid
     dBase              mSQL               Sybase
     Empress            MySQL              Velocis
     FilePro            Oracle             Unix dbm
     Informix           PostgreSQL

Une base de données regroupes plusieurs tables de données. Par exemple pour une application dont la base est nommée GESTION, les tables pourront s'appeler CLIENTS, FOURNISSEURS, ARTICLES et COMMANDES. On suppose que le lecteur, la lectrice de ce cours ont quelques connaissances sur les bases de données en général. Sinon, nous recommandons le cours de P. RIGAUX et l'ensemble du site Web correspondant qui s'adresse aux étudiants du CNAM, cycle A à l'adresse


     http://cortes.cnam.fr:8080/BDA/DOC/cbd.pdf

Nous alllons présenter ici l'accès aux bases de données SQL du gestionnaire MYSQL. MYSQL se compose d'un langage de définition de données et de droits ainsi qu'un langage de manipulation des données. MYSQL est disponible sous Windows et sous Unix. De nombreux sites Web gèrent leurs bases de données avec le couple PHP/MYSQL. Le site officiel de MYSQLest http://www.mysql.com. La version utilisée pour ce tuteur est 3.22.29.

Notre premier exemple de requête a pour but de montrer comment on établit une connection avec le serveur de bases de données. La lecture du manuel de PHP indique que la connection se fait par mysql_connect(); que la sélection de la base de données est réalisée par mysql_select_db , qu'une requête utilise la syntaxe mysql_query(), que chaque ligne résultat de la requête doit etre convertie en tableau avec mysql_fetch_array() et qu'enfin on ferme la connection par mysql_close() .

Nous allons donc essayer d'ouvrir la base EE pour l'utilisateur YY sur le site XXX.XXX.XX.XX pour ensuite compter le nombre d'enregistrements de la table UU (pour raison de confidentialité et pour éviter de nombreux accès à nos bases, nous avons remplacé les noms de champs, les numéros IP etc. par des valeurs plus anonymes).

Le programme PHP suivant est suffisant pour réaliser le comptage :


<?  mysql_connect("XXX.XXX.XX.XX","XX","");
    mysql_select_db("EE");

    $res  = mysql_query("select count(*) from UU") ;
    $ligr = mysql_fetch_array($res) ;
    $nbst = $ligr["count(*)"] ;

    echo " il y a  $nbst enregistrement(s)." ;
?>

Détaillons un peu la gestion de la requête : à la fin de l'exécution de la fonction mysql_query , MYSQL renvoie vrai (TRUE ) si la requête s'est bien passée, faux (FALSE ) sinon. La fonction mysql_fetch_array permet de récupérer (FETCH ) les différentes lignes du tableau (ARRAY ) du résultat de la requête. Comme ce tableau est associatif, il faut utiliser l'indice qui correspond au corps de la requête.

Vous pouvez tester ici ce programme.

Il est à noter que la requête ne doit pas se terminer par un point-virgule alors qu'en session MYSQL ou en programme MYSQL le point-virgule ets obligatoire pour terminer une instruction. Les autres instructions d'interfaçage de MYSQL disponibles en PHP3 avec leur description en anglais sont :


   mysql_affected_rows
        Get number of affected rows in previous MySQL operation
   mysql_close
        Close MySQL connection
   mysql_connect
        Open a connection to a MySQL Server
   mysql_create_db
        Create a MySQL database
   mysql_data_seek
        Move internal result pointer
   mysql_db_query
        Send an MySQL query to MySQL
   mysql_drop_db
        Drop (delete) a MySQL database
   mysql_errno
        Returns the number of the error from previous operation
   mysql_error
        Returns the text of the error from previous operation
   mysql_fetch_array
        Fetch a result row as an associative array
   mysql_fetch_field
        Get column information from a result and return object
   mysql_fetch_lengths
        Get the length of each output in a result
   mysql_fetch_object
        Fetch a result row as an object
   mysql_fetch_row
        Get a result row as an enumerated array
   mysql_field_name
        Get the name of the specified field in a result
   mysql_field_seek
        Set result pointer to a specified field offset
   mysql_field_table
        Get name of the table the specified field is in
   mysql_field_type
        Get the type of the specified field in a result
   mysql_field_flags
        Get the flags for the specified field in result
   mysql_field_len
        Returns the length of the specified field
   mysql_free_result
        Free result memory
   mysql_insert_id
        Get the id generated from the previous INSERT operation
   mysql_list_fields
        List MySQL result fields
   mysql_list_dbs
        List databases available on on MySQL server
   mysql_list_tables
        List tables in a MySQL database
   mysql_num_fields
        Get number of fields in result
   mysql_num_rows
        Get number of rows in result
   mysql_pconnect
        Open a persistent connection to a MySQL Server
   mysql_query
        Send an SQL query to MySQL
   mysql_result
        Get result data
   mysql_select_db
        Select a MySQL database
   mysql_tablename
        Get table name of field

4.3  Requêtes PHP/MYSQL plus sophistiquées

Montrons sur un exemple plus détaillé comment gérer via PHP les sorties MYSQL. Supposons que notre table que nous nommerons diremail de la base, disons BD, contienne des adresses-mail comme xyz@tagada.com dans le champ email et que l'on dispose de l'année, du mois et du jour de création de l'adresse par notre système informatique, mis respectivement dans les champs anneR, moisR et jourR. On voudrait avoir un rapport sur le nombre d'adresses crées. Notre premier programme vient afficher le nombre total d'adresses dans la base et liste le nombre d'adresse par mois. Par exemple on pourrait obtenir:


  Statistiques par mois sur les adresses :

     le 20/01/2000 à 03:42
     on a 32753 adresses

  Choisissez le mois à visualiser

     2000    Février        12    0 %
             Janvier     10400   32 %
     1999    Décembre    10478   32 %
             Novembre    11811   36 %
             Septembre      56    0 %

où chaque mois est cliquable. Ainsi, si on clique sur le mot Février,


  Statistiques par jour pour le mois de :  Février 2000

     Jour   1  :   8  Adresses
            2  :   1  Adresses
            3  :   3  Adresses

Notre programme commence bien sûr commence par établir une connection puis affiche le nombre total d'adresses. On effectue ensuite le recensement des années par un select distinct(anneR) que l'on trie par order by anneR. Une boucle while qui utilise my_sql_fetch permet de transférer les années dans un tableau PHP. La même technique permet de construire un tableau des mois. On boucle ensuite sur les années et sur les mois. Pour une année et un mois donnée, s'il y a un nombre d'adresses non nul, on construit l'ancre <a href=...> correspondante. La page statmois.php3 est alors appelée qui donne le détail jour par jour suivant le même principe.


<? # gestion d'adresses email dans une base mysql via php

# connection SQL et ouverture de la base

mysql_connect("localhost","root","");
mysql_select_db("test");

# 1. a comptage global

$res  = mysql_query("select count(email) from BD") ;
$ligr = mysql_fetch_array($res) ;
$nbst = $ligr["count(email)"] ;

# 1. b affichage du comptage global

$dthr = date(" d/m/Y à H:i ") ;
echo " <font size=6>&nbsp;&nbsp;&nbsp;&nbsp;" ;
echo " le $dthr " ;
echo " <br><font size=6>&nbsp;&nbsp;&nbsp;&nbsp;" ;
echo " on a : " ;
echo " <font size=+4 color=000088><b>$nbst</b></font>adresses" ;

# 2. détail mois par mois et proposons
#    (avec sélection possible d'un mois donné)

# 2.a recensement des années

$qry  = "select distinct anneR from BD order by anneR " ;
$res  = mysql_query($qry) ;


$nbans  = 0 ;
while ($ligr=mysql_fetch_array($res)) {
  $nbans++ ;   $ans[$nbans] = $ligr["anneR"] ;
} ; # fin de tant que

echo "<h1>choisissez le mois : </h1>         " ;

# 2.b recensement des mois

$qry  = "select distinct(moisR) from BD order by moisR" ;
$res  = mysql_query($qry) ;
$nbmois = 0 ;
while ($ligr=mysql_fetch_array($res)) {
  $nbmois++ ;   $mois[$nbmois] = $ligr["moisR"] ;
} ; # fin de tant que

# 3. passage en revue des années et de mois
# on crée une ancre <a href=...> si pour le mois
# et l'année courante il y a un nombre non nul
# d'adresses

echo "<table> " ;
$ian = $nbans ;
while ($ian>=1) {
   $van = $ans[$ian] ;

   $imois = $nbmois ;
   $jmois = 0 ;
   while ($imois>=1) {
     $vmois = $mois[$imois] ;
     $qry   = "select count(email) from BD " ;
     $qry  .= 'where (moisR=".$vmois." and anneR=".$van.")' ;
     $res   = mysql_query($qry) ;
     $ligr  = mysql_fetch_array($res) ;
     $nbpa  = $ligr["count(email)"] ;

     if ($nbpa>0) { # il faut préparer l'URL
        $jmois++ ;
        $nbpa  = sprintf("%3d",$nbpa) ;
        $pct   = sprintf("%3d",round(100.0*$nbpa/$nbst)) ;
        $nmois = nomMois($vmois) ;
        echo   "<tr><td><font size=+3>&nbsp;&nbsp;" ;
        if ($jmois==1) { echo $van ; } ;
        echo   "&nbsp;&nbsp;</td><td><font size=+3>" ;
        $choix = $van."*".$vmois."*" ;
        echo   "<b><a href="statmois.php3?choix=$choix&"#62;
                                       $nmois</a></td>" ;
        echo   "<td align=right><font size=+4 color=880000>
                         &nbsp;&nbsp;&nbsp;&nbsp;$nbpa</td>" ;
        echo   "<td align=right><font size=+4 color=008800>
                   &nbsp;&nbsp;&nbsp;&nbsp;$pct %</td></tr>" ;
     } ; # finsi sur $nbpa>0
     $imois-- ;
   } ; # fin de tant que sur $imois

  $ian-- ;
} ; # fin de tant que sur $ian
echo "</table> " ;
## -- fin de programme
?>

Vous pouvez tester ici ce programme.

5.  Exemples plus techniques en PHP

On trouvera ici une collection de scripts plus techniques et plus originaux. Le fichier phpprogs.zip contient les sources de ces programmes et des formulaires associés.

    5.1 Dictionnaires d'un fichier texte

    5.2 Classification hiérarchique de données bactériologiques

    5.3 Identification automatique de vecteurs d'absence-présence

    5.4 Graphiques avec jpgraph

    5.5 Production de pdf avec ezpdf

 

   retour    retour à la table des matières