Il existe deux
manières de transmettre les données d'un formulaire à un programme
Perl, deux méthodes (correspondant à la valeur de l'attribut METHOD
de la balise <FORM> de la page HTML où se situe le
lien vers le CGI) qui font appel à deux variables d'environnement
distinctes: QUERY_STRING pour la méthode GET, CONTENT_LENGTH pour
la méthode POST.
La méthode GET
Les données sont transmises par l'intermédiaire de l'URL cible.
Par exemple, si le formulaire comporte deux champs : l'un nommé
nom, l'autre prénom, on pourra avoir :
http://www.monsite.com/cgi-bin/monscriptperl.cgi?&nom=DUPONT&prenom=Jean
Le contenu de la variable Perl $ENV{QUERY_STRING} est alors « &nom=DUPONT&prenom=Jean ».
L'inconvénient vient du fait que les serveurs limitent, généralement
à 256 caractères, la longueur des URL. Ainsi, de volumineux formulaires
ne pourront être transmis par la méthode GET.
La méthode POST
Les données sont transmises sous forme d'une requête au
serveur, et le CGI les interprète comme un flux sur le canal
d'entrée standard (STDIN). De cette manière, la taille de ce flux
n'est pas limitée, ce qui permet de gérer de « gros formulaires ».
En contrepartie, un problème se pose, si, par exemple, vous souhaitez
que votre formulaire envoie les données non au CGI directement,
mais à une page HTML qui, par l'intermédaire de l'instruction SSI
#exec (à supposer que le serveur la supporte), fait appel au CGI
(ce genre d'opération permet notamment de simplifier grandement
le travail de personnalisation des pages renvoyées par le CGI),
alors la méthode POST est inopérante, et seule la méthode GET conviendra.
La variable Perl qui nous intéresse alors est $ENV{CONTENT_LENGTH},
qui contient la longueur du flux d'entrée. On récupérera
alors son contenu avec la fonction Perl read() :
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
La variable $buffer contient alors ce qu'aurait contenu $ENV{QUERY_STRING}
avec la méthode GET (on peut écrire dans ce cas $buffer=$ENV{QUERY_STRING}).
La récupération
des données du formulaire est donc assez différente dans les deux
cas. Une fois cette étape effectuée, il reste à « découper »
notre variable $buffer. La méthode pour cette dernière opération
est décrite par ailleurs (voir notre article sur l'élaboration d'un
). Elle nécessite, en particulier la connaissance des
.
Mais d'autres moyens, plus simples, sont à la disposition du développeur,
et reposent, l'un sur la bibliothèque de fonctions Perl cgi-lib.pl,
l'autre sur le module CGI.pm.
Se simplifier la tâche
Rendre accessible le module CGI.pm par un programme Perl
nécessite l'instruction use CGI ; On peut alors récupérer les
données d'un formulaire (que la méthode d'envoi ait été GET ou POST),
en créant un objet de type CGI :
my $buffer = new CGI ;
Alors les différents noms des champs du formulaire sont contenus
dans le tableau :$buffer->param (on écrira par exemple :
@noms = $buffer->param; pour récupérer
tous les noms)
On récupérera la valeur d'un champ particulier (dont le nom est
par exemple « nom ») par : $valeur=$buffer->param(nom');
Le module CGI.pm offre par ailleurs des outils très puissants de
manipulation de formulaires HTML.
Pour plus d'information sur cette librairie : http://www.mathematik.uni-ulm.de/help/perl5/modules/CGI.pm.html
Avec la bibliothèque cgi-lib.pl,
on dispose de la sous-routine ReadParse, que l'on utilisera ainsi
(indépendamment de la méthode d'envoi) :
&ReadParse(*FORM);
placera les données du formulaire dans le tableau associatif %FORM
(ou tout autre nom que l'on souhaitera lui donner). On récupérera
alors les noms des champs par @noms
= keys(%FORM);
et les
valeurs par (cas ou le nom du champ est « nom »): $valeur=$FORM{nom'};
Précisons, pour finir sur l'envoi à un script CGI/Perl de données
d'un formulaire, que la variable $ENV{REQUEST_METHOD'} contient
le nom de la méthode utilisée pour l'envoi, à savoir GET ou POST,
suivant le cas.
|