SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl


Instructions CGI typiques en Perl

Cette page est un document avec du texte et des informations

 Lire les données d'un formulaire
 Envoyer les données lues comme Mail à celui qui propose le formulaire
 Envoyer du code HTML au navigateur

 

Lire les données d'un formulaire

Vous pouvez utiliser le code Perl suivant pour lire par CGI les données d'un formulaire HTML quelconque. Pensez que ce n'est pas un script Perl complet mais à vrai dire une partie de programme indépendante que vous pouvez utiliser à des fins personnelles.

Code Perl:

if($ENV{'REQUEST_METHOD'} eq 'GET')
 {
  $donnees = $ENV{'QUERY_STRING'}
 }
else
 {
  read(STDIN, $donnees, $ENV{'CONTENT_LENGTH'});
 }

@champsformulaire = split(/&/, $donnees);
foreach $ (@champsformulaire)
 {
  ($name, $value) = split(/=/, $);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;
  $formulaire[$i] = $name;
  $i = $i + 1;
  $formulaire[$i] = $value;
  $i = $i + 1;
 }

Explication:

Le code Perl ci-dessus vérifie d'abord si le formulaire HTML utilise la méthode GET ou POST et prend les données transmises en fonction de la méthode. La méthode indiquée dans le formulaire HTML importe donc peu - ce code Perl accède dans tous les cas aux données transmises.

Ces données se trouvent dans un premier temps dans la  variable scalaire simple $donnees. La valeur de $donnees a, à ce stade, l'aspect du  flux de données lors de la transmission de données de formulaire.

Avec l'instruction @champsformulaire = split(/&/, $donnees); la chaîne de caractères $donnees  est transformée en liste. Comme signe de séparation qui, du flux de données, fait des éléments de liste est mentionné le ET commercial (&). Les différents champs du formulaire sont séparés les uns des autres par ce signe dans le flux de données du formulaire.

Ensuite les champs respectifs de la nouvelle  liste @champsformulaire sont traités dans une  boucle foreach. D'abord, chaque champ de formulaire est décomposé en deux parties opération pour laquelle le signe égal est mentionné comme signe de séparation. Les deux parties sont rangées dans les variables scalaires simples $name et $value. Dans $name se trouve alors exactement ce qui a été défini avec la mention name= dans le champ correspondant du formulaire HTML. Dans $value figure ce que l'utilisateur a entré ou choisi comme valeur pour l'élément correspondant du formulaire. Supposons que le formulaire HTML contienne un  champ de saisie à une ligne, ayant été défini avec <input name="surnom" size=60 maxlength=60>. Supposons ensuite que l'utilisateur y ait saisi "noceur". Alors on aura pour ce champ de formulaire dans la variable scalaire simple $name la valeur surnom, et dans la variable scalaire simple $value la valeur noceur.

Avec les  processus de recherche et de remplacement dans les autres instructions de la boucle for les caractères de contrôle parasites qui sont restés du flux de données du formulaire sont retirés.

Les données du formulaire sont finalement écrites dans une liste @formulaire. Les éléments pairs de cette liste donc $formulaire[0], $formulaire[2], $formulaire[4] etc. contiennent les noms de champs que l'utilisateur a renseignés. Les éléments impairs, donc $formulaire[1], $formulaire[3], $formulaire[5] contiennent leurs données respectives, entrées par l'utilisateur. Vous pouvez traiter cette liste dans le déroulement ultérieur du script Perl.

Attention:

Les codes présentés ici en exemple sont très rudimentaires et ont plutôt l'objectif de présenter le principe du déroulement. Si vous avez besoin d'une solution plus professionnelle, vous devez la programmer vous-même ou prendre un  script Freeware ayant fait ses preuves.

 

Envoyer les données lues comme Mail à celui qui propose le formulaire

Les données d'un formulaire rempli peuvent être écrites sur le serveur, par exemple dans un fichier évalué régulièrement par vos soins. La plupart des annonceurs désirent cependant recevoir ces données tout de suite par courrier électronique.
Le code Perl qui suit est basé sur le  code Perl ci-dessus et doit donc figurer à la suite du même script.

Code Perl:

$Mailprogramm = "/usr/lib/sendmail";       # voir explication ci-dessous
$objetcourrier = "Formulaire-Feedback";    # voir explication ci-dessous
$destinataire = "votrenom\@Provider\.xxx"; # voir explication ci-dessous
$expediteur = $formulaire[1];              # voir explication ci-dessous
$adresseexp = $formulaire[3];              # voir explication ci-dessous

open(MAIL,"|$Mailprogramm -t") || die;

print MAIL "To: $destinataire\n";
print MAIL "From: $adresseexp $expediteur\n";
print MAIL "objet: $objetcourrier\n\n";

$i = 0;
$max = $#formulaire;
for($i=0;$i<=$max;$i=$i+2)
{
 print MAIL "$formulaire[$i]: $formulaire[$i+1]\n";
}
close(MAIL);

Explication:

Le code Perl ci-dessus commence par définir quelques  variables scalaires simples.
La première et la plus importante variable scalaire simple est $Mailprogramm. Ici, il vous faut mentionner où sur l'ordinateur serveur se trouve le programme qui travaille comme serveur pour la sortie des courriers. Le programme standard pour l'envoi des courriers est le programme sendmail, qui est en service sur presque tous les ordinateurs serveurs sur Internet - c'est pourquoi la mention typique sur les serveurs Unix est /usr/lib/sendmail. Demandez, le cas échéant, à votre fournisseur d'accès ce que vous devez mentionner exactement à cet effet. Si cette valeur manque ou si elle est erronée, la transmission par courrier électronique ne fonctionne pas!
Pour la variable scalaire simple$objetcourrier dans le code Perl ci-dessus, vous pouvez mentionner l'objet de la réponse Mail qui vous est envoyée.
Pour la variable scalaire simple$destinataire vous devez mentionner votre propre adresse électronique ou plutôt l'adresse à laquelle les courriers doivent être envoyés.
Les deux variables scalaires simples $expediteur et $adresseexp n'ont été à vrai dire définies que pour une meilleure lisibilité. À ces variables scalaires simples sont affectées certains contenus du formulaire. Cela ne marche de toutes façons que si votre formulaire contient un champ pour le nom de celui qui le remplit et un champ pour son adresse électronique. Portez dans ce cas les numéros d'index corrects # pour $formulaire[#] (À ce sujet voyez  un peu plus haut).

Le code Perl ci-dessus ouvre ensuite dans la poursuite de son exécution le fichier-programme du serveur Mail. L'option -t pour la fonction open se réfère au programme supposé sendmail. Si vous utilisez un autre programme ou êtes obligé de le faire, renseignez vous sur la façon d'appeler ce programme avec des données à envoyer!
Si le programme ne peut pas être appelé, le script Perl ci dessus est terminé sans commentaire avec die. À cet endroit, vous pouvez insérer un traitement de l'erreur.

Avec les commandes print le script écrit les données qui lui sont connues dans l'entête de courrier. Chaque courrier électronique Internet a un format uniforme. Dans l'entête du courrier se trouvent différentes mentions. Certaines d'entre elles ne sont fixées que dans le cours du voyage vers le destinataire.

Dans la  boucle for les différentes données du formulaire sont écrites dans le courrier électronique. Les noms de champs et les contenus de champs du formulaire rempli sont séparés les uns des autres par des doubles points.

Attention:

Les codes présentés ici en exemple sont très rudimentaires et ont plutôt l'objectif de présenter le principe du déroulement. Si vous avez besoin d'une solution plus professionnelle, vous devez la programmer vous-même ou prendre un  script Freeware ayant fait ses preuves.

 

Envoyer du code HTML au navigateur

Une des missions les plus importantes des scripts CGI est d'envoyer du code HTML au navigateur WWW qui appelle. Pour le faire, vous pouvez insérer à votre gré des variables de votre script Perl dans le code HTML.
Le code Perl qui suit est basé sur le  code Perl ci-dessus et doit donc figurer à la suite du même script. Il envoie des remerciements à l'utilisateur qui a rempli le formulaire.

Code Perl:

print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>Merci!</title>\n";
print "</head>\n";
print "<body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=006600 alink=#0000FF>\n";
print "<h1>Merci</h1>\n";
print "Nous nous réjouissons que vous ayez rempli notre \n";
print "formulaire. Ci-aprés vos données pour le contrôle:<p>\n";

for($i=0;$i<=$max;$i=$i+2)
{
 print "<b>$formulaire[$i]:</b> $formulaire[$i+1]<br>\n";
}
print "<p><hr noshade size=1><p>";
print "<i>Votre nom, <a href=\"mailto:votrenom\@Provider.xx\">votrenom\@Provider.xx</a></i>";
print "</body>\n";
print "</html>\n";

Explication:

Vous pouvez écrire très facilement du code HTML en Perl grâce à la fonction print. Dans le code ci-dessus un fichier HTML complet est envoyé par ce moyen au navigateur WWW.

Pour ceci, la première instruction est importante. Elle s'intitule: print "Content-type: text/html\n\n";. Ceci n'est pas encore du code HTML. Le navigateur WWW qui reçoit le code attend d'abord un entête de fichier. Cet entête doit au moins contenir des informations sur le genre de données qui suit. Avec cette instruction vous faites part au navigateur que du code HTML va être envoyé. Absoluement indispensables aussi sont les deux \n\n à la fin!

Ensuite sont notées avec print les commandes habituelles pour la construction d'un fichier. La  boucle for du milieu de l'exemple de code réclame une attention particulière. C'est là que les contenus de la liste @formulaire (voyez  un peu plus haut) sont sortis formatés HTML. Cette possibilité de lier les contenus de variable directement avec le code HTML qui doit sortir, est la raison pour laquelle CGI est aussi souvent désigné comme "HTML dynamique".

Pour terminer, vous devez encore porter attention à la sortie HTML de la commande mailto dans la partie inférieure de l'exemple de code. Si vous voulez sortir les repères HTML avec les mentions devant figurer entre guillemets ainsi que la mention href, alors il vous faut masquer les guillemets avec une barre oblique inversée. Sinon, l'interpréteur Perl enverrait un message d'erreur. De la même façon, il vous faut masquer le signe courrier électronique @, étant donné que dans le cas contraire, ce signe, dans une fonction print de Perl, serait interprété comme une liste à sortir.

après: Ordinateur et langage écrit
avant: Travailler avec des nombres et le temps
 

SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl

© 1998 Stefan Münz / © 2001 Traduction  Serge François, 13405@free.fr