Le CGI en Perl




  1. Principe Général

Entre Unix et Windows, le problème est différent, ce qu'il est important de savoir est que les scripts CGI sont interprétés par le serveur. Cela signifie que l'utilisateur voit s'afficher uniquement la partie correspondant à une sortie d'écran ou à une erreur. Il est donc nécessaire, pour les serveurs tournant sous un Unix, que les scripts CGI (Perl ou non) soit avec les droits d'execution (+x).

Un script CGI en Perl est un petit programme perl qui sera lancé depuis un navigateur web. Il est important de noter que la majorité des scripts peut être malgré tout lancée en ligne de commande, ce qui permet parfois de mieux débugger les problèmes.

Voici un exemple de fichier perl fonctionnant dans un script appelé par un navigateur sur un serveur Unix :
#!/usr/bin/perl 

print "content-type: text/html\n\n"; 
print "<html><head><title>exemple en perl</title></head>\n"; 
print "<body>\n"; 
print "les cgi s'exécutent bien sur votre serveur !\n"; 
print "</body></html>\n";

Dans ce programme, on retrouve 3 partie :
  • #!/usr/bin/perl : permet de définir le chemin d'accès vers le programme d'éxecution. Nécessaire sous Unix pour la bonne execution du programme.
  • print "content-type: text/html\n\n"; : Ligne permettant au serveur et au browser d'interpréter correctement le reste du text. Cette ligne est essentielle. Si vous ne l'avez pas, vous obtiendrez une erreur 500.
  • print "<body>\n"; : les 4 dernières lignes qui ne sont que de l'affichage HTML.
Mais évidemment, l'intérêt du script est en général de traiter des informations, que ce soit des formulaires saisis par l'utilisateur, ou autre... Donc, fréquemment, vous aurez besoin du package "CGI.pm" qui apporte de nombreuses fonctionnalités, comme on va le voir maintenant dans les exemples suivants.



  2. Traitement de Formulaire



  2. 1. Code du formulaire HTML

Voici le code du formulaire HTML utilisé dans les exemples suivants.
<html> 
<head> 
<title>formulaire hobbesworld pour traitement perl</title> 
</head> 
<body> 
<form action="/cgi-bin/formperl.pl" method="get"> 
entrer votre nom : <input name="nom" size=25><br> 
entrer votre prenom : <input name="prenom" size=25><br> 
entrer votre mois de naissance : <select name="moisnaissance"> 
<option>janvier 
<option>fevrier 
<option>mars 
<option>avril 
<option>mai 
<option>juin 
<option>juillet 
<option>aout 
<option>septembre 
<option>octobre 
<option>novembre 
<option>decembre 
</select><br> 
quel est votre sexe (et pas entrer votre sexe, attention...) : 
<input type=radio name="sexe" value="homme">homme 
<input type=radio name="sexe" value="femme">femme 
<input type=radio name="sexe" value="autre">autre<br> 
<input type=checkbox name="majeur"> je suis majeur<br> 
<textarea name="commentaire">[commentaire]</textarea><br> 
<input type=submit value="valider"> 
<input type=reset value="reinitialiser"> 
</form> 
</body> 
</html>


  2. 2. Sans le module CGI.pm



  2.2.1. Code de traitement

Le code de traitement associé est :
#!/usr/bin/perl 

print "content-type: text/html\n\n"; 

%httpform = &read_query_string; 

print "nom : ".$httpform{'nom'}."<br>\n";
print "prenom : ".$httpform{'prenom'}."<br>\n";
print "mois : ".$httpform{'moisnaissance'}."<br>\n";
print "sexe : ".$httpform{'sexe'}."<br>\n";
if ($httpform{'majeur'} =~ /on/) {
  print "je suis majeur<br>\n";
}
else {
  print "je ne suis pas majeur<br>\n";
}
print "mes commentaires : <ul><pre>".$httpform{'commentaire'}."</pre></ul>\n";

print "contenu html\n";

sub read_query_string
{
  local ($buffer, @pairs, $pair, $name, $value, %form);
  $buffer = $env{'query_string'};
  @pairs = split(/&/, $buffer);
  foreach $pair (@pairs)
  {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%(..)/pack("c", hex($1))/eg;
    $form{$name} = $value;
  }
  %form;
} }
Pour l'instant, ce code ne fonctionne qu'avec la méthode 'GET'. Pour la méthode 'POST', je verrais ensuite.


  2.2.2. Explication du code

Il y a 3 parties importantes dans ce programme :
  • L'initialisation du programme : définition du "content-type" et récupérationd des variables
  • L'utilisation des variables dans le code HTML : les $httpform{'nomChamps'}
  • La fonction "read_query_string" : fonction qui interprète les informations renvoyées par le formulaire
Comme nous l'avons vu précédemment, la ligne "print "content-type: text/html\n\n";" est primordiale pour le bon fonctionnement du script. Ensuite, grâce à l'appel de la fonction "read_query_string", on recopie le contenu de chaque champs du formulaire dans l'objet "httpform" (vous pouvez mettre n'importe quel nom).

Pour utiliser le résultat d'une variable, il vous suffit alors de mettre le nom du champs entre guillemets :
"$httpform{'prenom'}" renvoit le contenu du champs "prenom".
Comme vous pouvez le voir pour le champs "majeur" (correspondant à la case à cocher), on peut également faire des opérations sur le résultat comme sur toutes chaines de caractères.

Enfin, la fonction "read_query_string". Par définition, elle ne fonctionne qu'avec le GET puisqu'elle interprète la variable d'environnement QUERY_STRING (dans laquelle sont renvoyés tous les champs du formulaire). En voici le principe :
  • Récupération de la variable d'environnement 'query_string' en utilisant le tableau "$env"
  • Découpage de cette ligne en un tableau (@pairs) en fonction du caractère "&" (séparation des champs dans une requête GET)
  • Découpage de chaque cellule du tableau "@pairs" en 2 parties séparée par un "=" (format : "nomduchamps=valeur)
  • Remplacement tous les "+" par des espaces
  • Remplacement des valeurs HEXA par leur valeur alphanumérique
  • Construction du tableau indexé sur le nom du champs




  2. 3. Avec le module CGI.pm



  2.3.1. Code de traitement

#!/usr/bin/perl

use CGI;

$query = new CGI;

print "content-type: text/html\n\n";
print "nom : ".$query->param(nom)."<br>\n";
print "prenom : ".$query->param(prenom)."<br>\n";
print "mois : ".$query->param(moisnaissance)."<br>\n";
print "sexe : ".$query->param(sexe)."<br>\n";
if ($query->param(majeur) =~ /on/) {
  print "je suis majeur<br>\n";
}
else {
  print "je ne suis pas majeur<br>\n";
}
print "mes commentaires : <ul><pre>".$query->param(commentaire)."</pre></ul>\n";

print "contenu html\n";
Ce code fonctionne aussi bien avec le 'GET' que le 'POST' (défini dans le formulaire).


  2.3.2. Explication du code

Il y a 2 parties dans ce programme :
  • L'initialisation du programme : définition du "content-type" et récupérationd des variables
  • L'utilisation des variables dans le code HTML : les $httpform{'nomChamps'}
Comme nous l'avons vu précédemment, la ligne "print "content-type: text/html\n\n";" est primordiale pour le bon fonctionnement du script. Ensuite, en initialisant la variable "$query" (new CGI), on récupère automatiquement les champs du formulaire.

Pour utiliser le résultat d'une variable, il vous suffit alors de respecter le format :
$query->param(nom_du_champs)

Les opérations sont possibles sur ces champs comme avec l'autre méthode.



  3. Traitement de Cookie avec le module CGI.pm



  3. 1. Ecriture des cookies

Avec un seul cookie :
#!/usr/bin/perl

use CGI qw(:standard :html3); 
$the_cookie = cookie(-name=>'nom', 
                     -value=>'hobbesworld'); 
print header(-cookie=>$the_cookie); 
print "content-type: text/html\n\n"; 
print "votre cookie 'nom' est : créé"; 

Avec plusieurs cookies :
#!/usr/bin/perl 

use CGI qw(:standard :html3); 
$the_cookie = cookie((-name=>'nom', 
                      -value=>'hobbesworld', 
                      -path=>'/', 
                      -domain=>'.hobbesworld.com', 
                      -expires=>'+1d'), 
                     (-name=>'prenom', 
                      -value=>'laurent', 
                      -path=>'/', 
                      -domain=>'.hobbesworld.com'));
print header(-cookie=>$the_cookie); 
print "content-type: text/html\n\n"; 
print "votre cookie 'nom' est : créé"; 
L'écriture d'un cookie se fait donc en 2 parties :
  • Définition du coookie avec l'affectation 'cookie' : $the_cookie = cookie(-name=>'nom', -value=>'hobbesworld', -expires=>'+0d');
  • L'ajout du cookie avec l'ajout dans le header : print header(-cookie=>$the_cookie);
L'object 'cookie' contient 3 paramètres :
  • name : le nom du cookie
  • value : sa valeur
  • expires : durée de vie (+60s - 60 secondes, +60m - 60 minutes, +2h - 2 heures, +1M - 1 mois, +2y - 2 ans, now - maintenant)
Ensuite, le "print header" permet d'ajouter le cookie dans le header de la page. Il est a note que dans ce cas, au moment du chargement de la page, le cookie est ajouté et donc pas encore accessible, il ne le sera qu'au prochain chargement de page. Par conséquent, pour pouvoir utiliser un cookie que vous venez de fixer, vous devez définir la variable associée qui vous intéresse, comme dans l'exemple complet en bas de page.


  3. 2. Lecture des cookies

#!/usr/bin/perl 

use CGI qw(:standard :html3);  
print "content-type: text/html\n\n"; 
$nom = cookie('nom'); 
print "cookie : <br>votre cookie 'nom' est : $nom"; 
Comme nous l'avons vu précédemment (en fait, 10 lignes au dessus), vous ne pouvez pas directement lire un cookie que vous venez de fixer. Pour ceci, voir l'exemple complet en bas de page.


  3. 3. Effacer des cookies

#!/usr/bin/perl 

use CGI qw(:standard :html3);  
$the_cookie = cookie(-name=>'nom', 
                     -value=>'hobbesworld', 
                     -path=>'/', 
                     -domain=>'.hobbesworld.com', 
                     -expires=>'now'); 
print header(-cookie=>$the_cookie); 
print "content-type: text/html\n\n"; 
print "cookie : <br>votre cookie 'nom' est : effacé"; 
Effacer un cookie consiste en fait à l'ajouter, mais avec une duree de vie nulle. Ainsi, il se re-crée et s'efface immédiatement. D'où le "now" du "expires".


  3. 4. Exemples complets



  3.4.1. Fixer un cookie et l'utiliser directement

#!/usr/bin/perl 

use CGI qw(:standard :html3);  
$the_cookie = cookie(-name=>'nom', 
                     -value=>'hobbesworld', 
                     -path=>'/', 
                     -domain=>'.hobbesworld.com', 
                     -expires=>'+2d'); 
print header(-cookie=>$the_cookie); 
print "content-type: text/html\n\n"; 
$nom = cookie('nom'); 
print "cookie : <br>votre cookie 'nom' est : $nom"; 
A_venir...


  3.4.2. Tester l'existence d'un cookie puis redirection

A_venir...




Page modifiée le : 03/05/2004
Site modifié le : 16/05/2016


Valid XHTML 1.0 Transitional