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


Accueil

Les Cours

Archives ML

Inscription

Le Forum

Cours 3

Bonjour à toutes et à tous,


Voici la 3è leçon de ce 'cours'. Le thème du jour (ou plutôt de la semaine) est le stockage des informations récupérées par notre formulaire dans un fichier qui nous sert de base de données.
Le but en arrivant à la fin de ce cours est de disposer d'une base de données d'informations dans laquelle on peut faire des recherches.
Comme j'ai oublié de le dire, le but des scripts que nous créons est de se créer une petite base de données contenant des contacts et de permettre la recherche dans celle-ci.
La gestion ce faisant par une interface HTML.

Pour cette leçon nous allons repartir du formulaire utilisé pour la leçon précédente. Seul le nom du script sera modifié et remplacé par cours3.cgi
En plus d'afficher les informations à l'écran nous allons les enregistrer dans un fichier au format texte que nous allons appeler database.dat (si le nom ne vous convient pas, a vous de le changer :)

Nous allons enregistrer les informations de manière structurée dans ce fichier :
Chaque ligne va correspondre à un enregistrement (c'est a dire à un contact dans le cas ou on stocke des contacts) et les différentes informations relatives à un contact seront séparées les unes des autres par le caractère | (barre verticale)
Une ligne du fichier va donc ressembler à ceci :
Nom|prenom|rue|numero|code postal|localite|pays|

Notre script va donc effectuer 2 choses :
  • écrire dans le fichier les informations contenues dans le formulaire en suivant la présentation décrite ci dessus et si l'écriture dans le fichier s'est déroulée correctement
  • afficher une page html reprenant les informations saisies dans le formulaire.
    Si l'écriture ne s'est pas déroulée correctement ; on affiche un message d'erreur.

Voilà pour les principes, nous allons maintenant voir le code qui gère tout cela.

#!G:/Prg_internet/Perl/bin/perl.exe
# insertion d'infos dans un fichier texte
# ne gère pas les accès concurrents !
Ces 3 lignes de commentaires servent juste a spécifier le chemin d'accès à perl et à commenter le début du programme.

$db = "database.dat";
Ici je mets dans la variable db le nom du fichier qui va contenir mes informations. Comme il n'y a pas de chemin, mon fichier sera enregistré dans le même répertoire que le script cgi.
Si vous souhaitez le placer dans un autre répertoire, ce qui est plus logique dans un environnement de production, il faut indiquer le chemin complet. Exemple : c:/temp/database.dat

require "cgi-lib.pl";
&ReadParse(*in);
Ces 2 lignes sont les mêmes que pour le script précédent, elles servent à décoder le formulaire au moyen de la librairie cgi-lib.pl

if (&Insertion != 1)
{    &ConfirmationOK;
}
else
{    &PasOK;
}
Ici je teste la valeur renvoyée par Insertion. Insertion est une fonction qui est définie plus bas dans le programme ; son but est simplement d'insérer les valeurs dans le fichier.
Si la valeur de retour d'Insertion est différente de 1 alors j'exécute la fonction ConfirmationOK qui affiche la page de confirmation.
Si la valeur de retour est égale à 1 alors j'exécute la fonction PasOK qui affiche un message d'erreur.

exit 0;
Cela spécifie qu'une fois arrivé à cette ligne je quitte le programme en renvoyant le code 0. Ce code de retour d'un programme est parfois utilisé pour vérifier les erreurs d'un programme. Comme on renvoie 0, cela signifie qu'il n'y a pas d'erreur.

sub Insertion
{
Ce sont les premières lignes de déclaration d'une fonction en PERL.
Une fonction est un ensemble de lignes de code qui effectuent ensemble une action bien particulière. On regroupe généralement ces lignes dans des fonctions de façon a clarifier le code, en le structurant et de façon a pouvoir facilement réutiliser du code déjà existant.
Le code composant une fonction est entouré d'accolades { }

   open (DATABASE, ">>$db") || return 1;
Cela a pour but d'essayer d'ouvrir le fichier en ajout (indiqué par >>), c'est a dire en ajoutant des lignes à la fin du fichier existant, le fichier dont le nom est dans la variable db (à savoir database.dat) et de lui donner comme nom logique (cela s'appelle un handle en anglais) DATABASE.
Si le fichier ne peut être ouvert pour une raison quelconque, on quitte la fonction en renvoyant la valeur 1.
Les 2 barres verticales (||) symbolisent un OU.
J'ouvre le fichier OU je renvoie la valeur 1
A titre d'information, le ET s'écrit &&

print DATABASE "$in{'nom'}|$in{'prenom'}|$in{'rue'}|$in{'no'}|$in{'cp'}|$in{'localite'}|$in{'pays'}|\n";
Cette ligne imprime dans DATABASE (le nom que nous avons associé à notre fichier) les différents éléments du formulaire en les séparant par la barre verticale (|)
Vous vous étonnez probablement de voir que l'on utilise le print tant pour écrire dans un fichier que pour afficher à l'écran (= imprimer à l'écran).
En fait dans beaucoup de langages de programmation l'écran est considéré comme un fichier (STDOUT) et qui accessible en écriture en permanence. Si l'on ne spécifie pas le nom du fichier dans lequel on veut écrire, par défaut il s'agit de l'écran.
Pour afficher quelque chose a l'écran je pourrais donc utiliser :
print STDOUT " Mon message à l'écran " ;

   close(DATABASE);
Cette ligne permet simplement de fermer le fichier DATABASE. Si on oublie de le fermer, il ne sera pas accessible la prochaine fois et donc le programme générera la page d'erreur.
Donc en résumé, on ferme toujours les fichiers auxquels on accède dès que l'on en a plus besoin immédiatement (sauf le fichier STDOUT évidemment ;).


   return 0;
Cette ligne renvoie la valeur 0 si tout c'est bien passé. C'est uniquement si l'on arrive ici que le script affiche la page confirmant le succès de l'opération.

}
Cette accolade fermante permet de spécifier que l'on termine le bloc logique de la fonction Insertion.

sub ConfirmationOK
{
print &PrintHeader;
print <<FIN;
<HTML>
<HEAD>
<TITLE>Cours 3 : Insertion des données du formulaire</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">

Les données ont été insérées correctement<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
}
Il s'agit simplement du code de la page affichant que l'opération s'est déroulée correctement. Aucune fonctionnalité ne lui a été rajoutée depuis le cours précédent. Je l'ai simplement incluse dans une fonction pour plus de lisibilité du programme.

sub PasOK
{
print &PrintHeader;
print <<FIN;
<HTML>
<HEAD>
<TITLE>Erreur d'insertion</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<h2>
Les données n'ont pas été insérées correctement<br>
<br>
Réessayez
</h2>
</BODY>
</HTML>
FIN
}
Cette fonction ne s'affiche que si l'insertion ne s'est pas déroulée correctement. Elle affiche simplement un message d'erreur, en utilisant la même technique que celle utilisée pour le cours précédent ou la fonction précédente (Insertion).


Voilà c'est tout pour cette semaine. Il ne vous reste plus qu'a tester le script joint en annexe et a le comprendre.


Remarque : ce script ne gère pas les accès concurrents, c'est a dire que si 2 personnes accèdent en même temps au fichier, un des 2 ajouts risque d'être perdu ou le fichier risque d'être corrompu.
C'est une modification qui est a faire si le script doit passer en production sur Internet.
Ce n'est pas très compliqué, il suffit de réfléchir un peu :) ou de regarder d'autres script sur Internet. En fait sur unix il est possible d'empêcher l'accès à un fichier en utilisant la fonction flock. Sous Win cette fonction n'existe pas, il faut alors en créer une.


Comme d'habitude, la suite dans un peu plus d'1 semaine si tout va bien :) mais on en reparle avant sur la liste en fonction de vos questions (enfin si vous voulez).
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.


Les fichiers utilisés :
Le code HTML
Le script CGI



Hit-Parade

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

Design du site par ionet-look