formulaire en PERL /J Gourdin

Traitement d'un formulaire en PERL


Requête CGI en PERL

Perl est un langage de script puissant et efficace pour traiter les fichiers texte.
Il est très utilisé comme langage de script pour effectuer des traitements CGI sur le serveur.
La syntaxe du code est proche de celle du langage C, et peut être adressé directement :

Architecture générale

[image empruntée à ce remarquable site --> http://www.ac-montpellier.fr/mafpen/tice/formation/perl.html]

Les 2 méthodes de codage

Rappels
  1. La méthode GET consiste à ajouter à l'URL la chaine d'encodage des infos du formulaire.
    Cet URL est passé dans la variable QUERY_STRING
  2. Pour la méthode POST, la même chaine est expédiée sur l'entrée standard du script de CGI connecté à la soumission du formulaire.

Scripts de décodage

méthode GET: script get.pl

#recupere le contenu de la variable d'environnement
$input = $ENV{"QUERY_STRING"};
#dissocie la chaine de caracteres en une liste
@liste= split(/&/,$input);
#parcours de la liste
foreach (@liste) {
 #dissocie la paire nom=valeur
($name,$value)= split(/=/, $_);
 #decode les valeurs
 $name =~   s/%(..)/pack("c",hex($1))/ge;
 $value =~  s/%(..)/pack("c",hex($1))/ge;

 #Traitement des données ....
}

méthode POST : script post.pl

 #recupere le contenu du buffer de l'entrée standard STDIN
$in = <STDIN>;
 #supprime les deux CRLF inseres par le protocole HTTP
chop($in);
chop($in);
 #dissocie la chaine de caractere en une liste
@liste = split(/&/,$in);
 #parcours de la liste
foreach(@liste) {
 #dissocie la paire nom=valeur
 ($nom,$valeur)= split(/=/, $_);
 #decode les valeurs
 $nom  =~  s/%(..)/pack("c",hex($1))/ge;
 $valeur =~  s/%(..)/pack("c",hex($1))/ge;

 #Traitement des donnees ...
}

Exemple de traitement d'un formulaire en PERL

Le formulaire suivant est situé dans le WEB du serveur p00

Formulaire

Indiquer :

 Nom 
 Prénom 
 Sexe   féminin masculin
 Profession   enseignant formateur

Code du formulaire

<FORM ACTION="http://p00/cgi-bin/formu2.pl" METHOD=POST>
<H1><DIV ALIGN="center">Traitement de formulaire par PERL</DIV></H1>
Indiquez :
Nom <INPUT TYPE="text" NAME="nom" SIZE=25  value="Toto">
Prénom <INPUT TYPE="text" NAME="prenom" SIZE=25 value="Jules">
Sexe 	<INPUT TYPE="radio" NAME="sexe" VALUE="féminin"> féminin
	<INPUT TYPE="radio" NAME="sexe" VALUE="masculin" CHECKED> masculin
Profession <input type="radio" checked  NAME="profession" VALUE=enseignant> enseignant
	<input type="radio" NAME="profession" VALUE="formateur" > formateur	
<P>
<INPUT TYPE="submit" VALUE="Valider">
<INPUT TYPE="reset" VALUE="Effacer">
</FORM>

Le script Perl

La validation du formulaire par clic sur le bouton submit provoque l'appel au script formu2.pl, écrit en PERL et situé réellement sur le serveur p00 à /home/httpd/cgi-bin/formu.pl
#!/usr/bin/perl
# exécution de /home/httpd/cgi-bin/formu.pl

# récupère  l'entrée standard dans la variable $in
read(STDIN, $in, $ENV{CONTENT_LENGTH});

# la chaine $in est coupée suivant le caractère & et crée la liste @champs
@champs = split(/&/,$in);

# traitement de chaque élément $e de la liste @champs
foreach $e (@champs) {
  # dissocie chaque élément, de la forme nom=valeur, 
  # en une paire de variable (nom,valeur)
  ($nom, $valeur) = split(/=/,$e);
	
  # transforme tous les caractères saisis en minuscules
  $valeur =~  tr/A-Z/a-z/;
	
  # crée à partir du tableau @champs, 
  # une liste associative %champs
  $champs{$nom}=$valeur;
}
# génére l'en-tête du document HTML renvoyé
print("Content-Type: text/html\n\n");
# puis le document HTML
print <<"SORTIE";
<HEAD><TITLE> Réponse </TITLE></HEAD>
<BODY>
<H2 ALIGN=CENTER>Réponse au questionnaire</H2>
<CENTER><TABLE BORDER><TR> <TH>Nom du champ <TH>Valeur</TR>
SORTIE

# le traitement est ici réduit à afficher les valeurs transmises
while (($nom, $valeur) = each(%champs)) {
print "<TR><Td>$nom = </td><Td>$valeur</td></TR>";
}
print "</TABLE></CENTER></BODY>";


Erreurs rencontrées

Message d'erreur renvoyé :
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might
have done that may have caused the error.
Premature end of script headers: /home/httpd/cgi-bin/post.pl

Attention !