Scripts-fr - L'annuaire francophone des scripts CGI http://www.scripts-fr.com


Accueil

Les Cours

Archives ML

Inscription

Le Forum

Cours 2

J'espère que vous êtes tous prêts a commencer (d'après ce que j'ai lu c'est le cas).
Le but de cette leçon est de récupérer les données provenant d'un formulaire et de les afficher dans une page html.
Nous allons procéder de 2 manières différentes : en utilisant cgi-lib.pl et CGI.pm

En attachement de ce mail se trouvent 4 fichiers, 2 fichiers html et 2 fichiers perl (.pl ou .cgi) que vous devez placer dans le répertoire ou vous placez vos pages html. (Il y a un script pour chaque façon de récupérer les données).

Les 2 fichiers html sont quasiment identiques, la seule chose qui change, c'est le scrit qui est appelé par le formulaire (via <form action="nomduscript.pl">)

Nous allons maintenant entrer dans le vif du sujet.
Le formulaire étant tout à fait standard, je ne le détaille pas; par contre je vais expliquer ligne par ligne le fonctionnement du script perl.
Un script perl est un fichier 'texte' tout à fait normal, pour l'éditer on utilise un éditeur de texte genre notepad, ultraedit, ...
Voici donc a quoi ressemble le contenu du script cours2_cgi-lib.cgi :

#!g:/prg_internet/perl/bin/perl.exe

require "cgi-lib.pl";

&ReadParse(*in);

print &PrintHeader;
print <<FIN;
<HTML>
<HEAD>
<TITLE>Cours 2 : données du formulaire</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">

Les données du formulaire<br>
<br>
Nom : $in{'nom'} <br>
Prénom : $in{'prenom'}<BR>
Rue : $in{'rue'}<br>
Numéro : $in{'no'}<BR>
Code postal : $in{'cp'}<br>
Localité : $in{'localite'}<BR>
Pays : $in{'pays'}<BR>
<br>
<br>
<br>
<a href="$ENV{'HTTP_REFERER'}">Retour au formulaire</a>
</BODY>
</HTML>
FIN

Parés pour l'explication ?


#!g:/prg_internet/perl/bin/perl.exe
Il s'agit de la première ligne de mon fichier perl. Elle indique le chemin d'accès a mon interpréteur perl.
Tout programme perl doit commencer par une ligne de ce type (remarque : ce n'est pas toujours obligatoire sous Windows, mais ca l'est pour Unix; donc on le mets, même si on utilise Windows).
Sous unix, elle ressemblera plutôt à #!/usr/bin/perl
A vous de changer la ligne en fonction de votre configuration.

Autre remarque : tout ce qui est après un # et se trouve sur la même ligne est donc ignoré par le perl.
Les commentaires sont utilisés pour clarifier certaines parties de la programmation, en expliquant les variables par exemple.

require "cgi-lib.pl";
Cette ligne indique a perl que pour exécuter le script il faut le fichier cgi-lib.pl.
Ce fichier est une librairie de fonctions perl que vous devez télécharger à partir de l'url http://cgi-lib.berkeley.edu/ . Pour plus d'infos sur ce qu'est cgi-lib.pl et comment on l'utilise, vous pouvez aller voir http://www.scripts-fr.com/apprendre/online/cgi-lib.shtml

Cgi-lib est une libraire de fonctions perl, qui nous permet de nous simplifier la vie car nous ne devons pas nous soucier du décodage des informations provenant du formulaire. La règle en informatique, c'est KISS : "Keep It Simple and Stupid" donc pour rester kiss, on ne réinvente pas la roue a chaque fois et on prend ce qui peut nous aider.

Remarquez que la ligne se termine par un point virgule. Chaque ligne de programmation d'un programme perl doit se terminer par un ;

&ReadParse(*in);
Cette ligne indique que nous allons utiliser la fonction ReadParse. Le sigle & indique que ce qui suit est le nom d'une fonction. Comme nous n'avons défini de fonction nulle part dans le programme c'est qu'elle vient d'ailleurs et dans ce cas ci de la librairie cgi-lib.
Le but de cette fonction est de décoder le contenu du formulaire et de mettre les différentes réponses dans un tableau qui s'appele 'in'.

print &PrintHeader;
Cette ligne nous permet d'afficher (avec print) le résultat de la fonction PrintHeader. De nouveau comme nous ne l'avons définie nulle part, c'est qu'elle vient d'ailleurs et cette fois encore c'est de cgi-lib.
Le but de cette fonction est de dire quel type de contenu on va renvoyer au browser : du texte, une image gif, un jpeg, ...
PrintHeader signale que l'on renvoie de l'html.
Nous aurions pu ne pas utiliser cette fonction, nous aurions alors du écrire : print "Content-type: text/html\n\n";

print <<FIN; Cette ligne ordonne à perl d'imprimer tout ce qu'il rencontre, jusqu'a ce qu'il trouve le mot FIN écrit en majuscules au début d'une ligne et suivi par une retour de chariot (un retour à la ligne).

<HTML>
<HEAD>
<TITLE>Cours 2 : données du formulaire</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
Les données du formulaire<br>
<br>
Ici il s'agit de code html tout à fait standard. Comme il n'y a pas le mot FIN écrit, on continue plus bas.
Ce code html permet de présenter le haut de la page avec le contenu du formulaire.

Nom : $in{'nom'} <br>
C'est ici que ca commence a se compliquer un peu puisque l'on mélange 2 types d'informations différentes :
1- du texte et de l'html tout à fait statique qui sert à faire la présentation de mes résultats
2- une valeur qui vient du formulaire, à savoir le nom $in{'nom'}. La variable contenant le nom qui a été indiqué dans le formulaire est donc $in{'nom'}.
Je vais tenter d'expliquer le principe :
le $ qui précède un nom indique qu'il s'agit d'une variable. $in est donc une variable. Si vous regardez un peu plus haut, on a dit que la fonction ReadParse mettait le contenu du formulaire dans le tableau in (drôle de coïncidence non :p )
Pour spécifier la valeur que l'on veut on utilise {'nom'} qui nous permet de rechercher l'élément nom du tableau in. (nom est le nom qui a été assigné au champ du formulaire par l'attribut name="xxx")
Donc si mon explication est valable, vous avez tous compris que pour afficher le prénom qui a été introduit dans le formulaire il faut taper ....

Sachant que le champ contenant le prénom s'appelle prenom, il faut donc écrire print $in{'prenom'} pour afficher le prénom.

Prénom : $in{'prenom'}<BR>
Rue : $in{'rue'}<br>
Numéro : $in{'no'}<BR>
Code postal : $in{'cp'}<br>
Localité : $in{'localite'}<BR>
Pays : $in{'pays'}<BR>

Ces lignes suivent la même logique, elles affichent le prénom, l'adresse et le pays en utilisant les noms des champs du formulaire.

<br>
<br>
<br>
Me permet de placer 3 lignes blanches dans mon formattage html.

<a href="$ENV{'HTTP_REFERER'}">Retour au formulaire</a> Cette ligne insère un lien dans la page de résultat qui permet de retourner à la page d'ou vous venez. J'aurais pu le faire plus simplement en donnant le nom de la page (cours2.htm) mais alors ce n'était pas dynamique.
En utilisant $ENV{'HTTP_REFERER'} comme nom de page, peut importe le nom de la page sur laquelle se trouve le formulaire, je suis sur d'y revenir.
Si vous examinez bien le nom, vous remarquez un $ ce qui indique qu'il s'agit d'une variable. Suivant le même principe que ce qui a été dit auparavant, ENV est un tableau d'éléments. Ce tableau ENV contient différents éléments qui sont envoyés par le browser au serveur lors de la demande d'une page, d'un script, d'une image, …
Ce tableau ENV contient ce que l'on appelle les variables d'environnement. HTTP_REFERER indique quel élément on désire afficher.
Pour voir d'autres variables, ré exécutez le 2ème script du mail précédent.

</BODY>
</HTML>
Ces 2 tags html tous simples nous permettent de clôturer notre page HTML en respectant les règles.

FIN
Voici le mot que Perl attendait pour terminer l'affichage d'informations. Il arrête donc d'imprimer à partir de ce point ci.


Voila, c'est tout pour le premier programme, a vous de jouer et de tester, mais avant cela encore quelques remarques :
- attention en perl, les majuscules sont différentes des minuscules donc $in{'nom'} et $IN'{nom'} ne sont pas du tout la même chose. Ce n'est pas le cas en html ou <b> et <B> ont le même effet.
- si vous avez un accès telnet ou si vous avez installé le perl sur votre pc, vous pouvez vérifier que le principe du cgi est bien de simplement afficher à l'écran le résultat. Pour cela, ouvrez une fenêtre dos, positionnez vous dans le répertoire contenant le script et tapez perl cours2.pl et voyez le résultat.
- plutôt que de faire un print <<FIN; j'aurais pu utiliser un print pour chaque ligne. Je ne l'ai pas fait car alors il faut modifier le code html et remplacer tous les " par ces \" car en perl nous utilisons aussi les " comme indicateurs de chaîne.
Par exemple pour la ligne définissant le body du document, j'aurais alors du écrire :
print "<BODY BGCOLOR=\"#FFFFFF\">";


Regardons maintenant la 2e façon de procéder, en utilisant CGI.pm
Dans ce cadre ci je ne vais utiliser CGI.pm que pour la récupération de paramètres et la création de mon header (en tete) et pas pour créer du code html, placer des cookies, …
Pour en savoir plus sur l'utilisation de cette librairie, vous pouvez consulter la doc.

La page HTML est quasiment identique a cette utilisée pour la 1ère partie, si ce n'est que j'appelle un autre script CGI.

Passons donc au script CGI cours2_cgi-pm.cgi :
#!g:/prg_internet/perl/bin/perl.exe

# déclare que j'utilise le module CGI
use CGI;

# crée un nouvel objet CGI nommé q
$q = new CGI;

# récupère les paramètres et les stocke dans une variable du meme nom
$nom = $q->param('nom');
$prenom = $q->param('prenom');
$rue = $q->param('rue');
$no = $q->param('no');
$cp = $q->param('cp');
$localite = $q->param('localite');
$pays = $q->param('pays');

print $q->header;
print <<FIN;
<HTML>
<HEAD>
<TITLE>Cours 2 : données du formulaire</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<font face="verdana,Arial">
Les données du formulaire<br>
<br>
Nom : $nom <br>
Prénom : $prenom<BR>
Rue : $rue<br>
Numéro : $no<BR>
Code postal : $cp<br>
Localité : $localite<BR>
Pays : $pays<BR>
<br>
<br>
<br>
<a href="$ENV{'HTTP_REFERER'}">Retour au formulaire</a>
</font>
</BODY>
</HTML>
FIN

Explications :
La première ligne est similaire a la première ligne du script présenté plus haut. Il faut donc l'adapter de la même manière.

use CGI;
Cette ligne indique au script que je vais utiliser le module perl CGI et que donc certaines fonctions auxquelles je vais faire appel se trouvent peut être dedans.

$q = new CGI;
permet créer un objet de type CGI qui porte le nom $q. Cet objet contient entre autres les valeurs passées comme paramètres a partir de la page précédente.
La problématique ici est de comprendre ce qu'est un objet : un objet est une entité logique qui possède certaines propriétés et fonctions qui fonctionnent ensemble pour accomplir une tache particulière.

$nom = $q->param('nom');
récupère la valeur du paramètre nom et la stocke dans la variable $nom.
Comment ca fonctionne ?
$q est l'objet CGI défini plus haut.
param() est une méthode de l'objet $q. On peut le vérifier en regardant le contenu du fichier CGI.pm ou on y trouve :
#### Method: param
# Returns the value(s)of a named parameter.

La flèche (->) indique que la méthode param s'applique à l'objet $q
La méthode param accepte un paramètre qui est le nom du champ dont on veut le contenu.
$prenom = $q->param('prenom');
suivant le même principe que pour le nom, cette ligne permet de récupérer la valeur contenue dans le champ prenom et de la stocker dans la variable $prenom.

$rue = $q->param('rue');
$no = $q->param('no');
$cp = $q->param('cp');
$localite = $q->param('localite');
$pays = $q->param('pays');
Même principe pour ces lignes.

print $q->header;
permet de générer un en tête HTTP standard, c'est a dire notre "Content-type: text/html\n\n"

Le reste du script est quasiment identique a la version avec cgi-lib.pl et ne devrait pas nécessiter d'explications.


Voila c'est tout pour cette semaine, la suite d'ici environ 1 semaine si tout va bien :) mais on en reparle avant sur la liste en fonction de vos questions.
Ne vous contentez pas de tester les exemples sur votre serveur, essayez de modifier un peu le code perl / html de façon à modifier le formulaire ou la façon dont sont affichées les données.



Pour rappel, vous pouvez retrouver une version HTML de ce cours et les exemples en fonctionnement sur http://cours.scripts-fr.com/cours/
(dès que j'aurai eut le temps de le mettre en html :-)

N'oubliez pas que le role de la liste de diffusion c'est de vous envoyer les mails, mais aussi et surtout de vous permettre de poser vos questions, expliquer vos problèmes, ...

Les fichiers utilisés :
HTML pour cgi-lib.pl
CGI pour cgi-lib.pl
HTML pour CGI.pm
CGI pour CGI.pm



Hit-Parade

Pour tout commentaire, n'hésitez pas à contacter le webmaster
© 1999-2001
Dernière modification : Tuesday, 16-Apr-2002 20:41:15 CEST

Design du site par ionet-look