< < E-NEF > >

Création de sites | Moniteurs | Chercher | Voyager | Cartes

()

Programmer avec les CGI en Perl


Emmanuel PIERRE epierre@mail.esiea.fr.

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 ou de 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";

counter
&copy; Copyright 1998-1999 Emmanuel PIERRE. Libre reproduction sous Licence LLDDv1.
Pour tout commentaire, webmaster@e-nef.com
Dernière MaJ 15/12/2017

Valid XHTML 1.0!

No Patents/