english version
La norme CGI (Common Gateway Interface) est une norme qui définit
la façon qu'ont les applications de communiquer avec butineurs de
l'Internet. Par défaut, le programme ou scripte reçoit sur
l'entrée standard les données sous forme codéé,
et renvoit en sortie les informations sous forme identifiée.
1. Codage de l'entrée
Le protocole HTTP (HyperTexte Transfert Protocol) définit des
commandes comme GET qui demande de récupérer les pages, et
les méthodes post et PUT pour transmettre des informations
aux scriptes. Le type de méthode est stoqué dans REQUEST_METHOD.
La méthode GET transmet les information dans la variable d'environnement
QUERY_StrING sous la forme nom de variable1=valeur&variable2=valeur,
les différentes valeurs sont séparées par un "&".
Ces informations apparaissent aussi sur la ligne de commande.
La méthode post transmet les informations de façon transparente,
la taille du contenu se trouve dans CONTENT_LENGTH, et le type de contenu
dans CONTENT_TYPE=x-www-form-urlencoded.
2. Codage de la sortie
Pour donner au browser le type d'informations renvoyées, on ui
renvoit une chained'identification Content-type: suivi du type MIME
et de deux retours à la ligne.
Le type pour une page html est text/html, pour une image gif
image/gif.
3. Implémentation
Vous pouvez utiliser la cgi-lib
qui contient toutes les primitives pour lire de façon transparente
les informations passées au scripte par une des deux méthodes.
Voici l'exemple d'un programme en perl utilisant cette librairie:
#!/usR/local/bin/perl
require "cgi-lib.pl"
&ReadParse(*in);
print &PrintHeader;
La première ligne définit le chemin vers l'interpréteur
Perl, la seconde charge la librairie dans le programme. Ensuite, on appelle
la fonction ReadParse qui va transformer l'entrée codée et
la stoquer sous forme de hashage associatif dans $in.
Ensuite on renvoie l'entête pour dire que l'on va renvoyer du
texte.pvec &PrintHeader. Il est très pratique d'afficher du
texte en Perl avec des Here-Documents:
print <<"FIN";
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> Projets du Web ESIEA
<meta name="GENERATOR" CONTENT="vim under Linux 2.0.31 [VIM]">
<meta name="Author" CONTENT="Emmanuel PIERRE">
<meta name="Description" CONTENT="WE Admin">
<meta name="Keywords" CONTENT="WE Admin">
</HEAD>
<body bgcolor="#42426F" background="/img/04sbs.jpg" text="#FFFF66"
link="#6699FF" vlink="#9966FF">
FIN
A partir d'ici, un simple print envoie sa sortie au browser ! Pour récupérer des variables d'environnement, il suffit de faire $mavariable=$in{'ENV_VAR'} comme par exemple pour obtenir le nom du browser visualisant la page:
$browser=$in{'HTTP_USER_AGENT'};
La liste non exhaustive des variables d'environnement est disponible ici.
4. Utilisation d'une base de données: MsqlPerl avec mSQL 1.0.16/2.0
Pour ce qui est des caractéristiques d'une base de données mSQL, se rapporter à Hughes Technologies. Ce type de serveur contient les fonction SQL de base nécessaires au développement d'applications sur le Web.
Dans un premier temps, il faut initialiser la connection au serveur de base de données:
sub mSQlinit {
# Initialisation de la base de données
# arguments: nom de l'hôte et de la base
($host,$dbase)=@_;
# Vérification que l'adapteur PerlMsql est présent.
#
&Exit("Impossible d'Initialiser/trouver l'adaptateur PerlMsql $@")
if (eval("use Msql"));
# Vérification de la connection
#
&Exit("Impossible de se connecter au serveur mSQL")
unless ($dbh=Connect Msql $host );
# Voyons ce qui est présent:
#
&Exit("Impossible d'obtenir une liste des bases")
unless( @dbase = $dbh -> ListDBs);
# Choix de la DB
#
&Exit("Impossible de choisir la base mSQL '$dbase'")
unless (Msql::SelectDB($dbh,$dbase));
}
A présent, il faut créer la requète SQL, l'envoyer et traiter son retour:
sub TreatSQL {
($table,$req)=@_;
# Obtention des noms de champs de la table
#
&Exit("Impossible d'obtenir des noms de champs pour $table")
unless ($sth = Msql::ListFields( $dbh,$table ));
# Si il y a des champs
#
if (!($sth->numfields)) {
&Exit("Pas de champs dans la table: $table");
};
&Exit("Could not do query '$req'")
unless ($sth = Msql::Query( $dbh ,$req ));
}
En retour, on renvoie une variable globale $sth contenant le résultat de la requète. Il faut alors savoir récupérer le résultat de la requète:
while (@row=FetchRow $sth ) {
print @row->[0];
}
Cette boucle affiche pour chage ligne renvoyée par la requète le premier champs.
5. Utilisation d'une base de données: DBI avec mSQL 1.0.16/2.0
L'interface DBI (DataBase Interface) permet d'utiliser le même ensemble de commandes pour différents types de bases de données, permettant avec un même script d'intéroger une base mSQL ou avec peu de modifications une base Oracle.
La connection se fait par $dbh = DBI->connect( "$database:$hostname:$port" ) puis une requète avec parcours par curseur:
my $cursor_a = $dbh->prepare("SELECT mode,ino,name FROM ?");
$cursor_a->execute('fic');
while (@row_a = $cursor_a->fetchrow) {
print @row->[0];
}
$cursor_a->finish;
ou plus simplement:
$dbh->do("INSERT INTO $testtable valueS( 1, 'Alligator Descartes' )")
or die "not ok: $DBI::errstr\n";
|