Récupération de saisie depuis un formulaire


Première reéussite dans l'utilisation d'une variable d'environnement d'Apache. (remise en forme d'un message électronique).

1. Explication de la solution apportée


- les deux petits scripts suivants s'exécutent sur un serveur web (avec Apache).
- sur le navigateur d'un client, s'affiche un formulaire classique (saisie d'infos personnelles, réponse dans un forum...).
Quand le client le décide, il clique "envoyer" sur le bouton qui va bien.
- le script Bash s'exécute, sur le serveur, en réaction au clic du bouton sur le client. Il s'agit d'une sorte de "cache-misère" qui me permet de contourner le fait que je ne sais pas lancer directement un script en Forth.
Il affiche "Vous avez cliqué sur le bouton Valider" sur le navigateur du client (fonction de vérification) et lance le script en Gforth par
./cuicui2.fs
- le script Gforth se sert de la variable d'environnement d'Apache appelée
QUERY_STRING
pour récupérer l'adresse et la longueur de la chaine de caractères qui contient le résultat de la saisie (celle-ci est concaténée en un seul flot de caractères).
En détail, cela donne :

1.1. Variables :

256 Constant max-line ( définition d'une constante annexe )
Create boite max-line allot ( création d'un tableau de 256 caractères )
variable lg 0 ( variable de type integer pour définir la longueur utilisée de la chaine )

1.2. Affectation :

En Pascal, on écrirait
boite :="QUERY_STRING";
Ici, on a créé un "mot forth" annexe qui charge la chaine et récupère sa longueur : "affecte".
Création du mot :
: affecte ( adr1 u adr2 -- ) swap dup lg ! cmove ;
Affectation :
s" QUERY_STRING" boite affecte

1.3. Vérification :

On s'assure que la variable "boite" contient bien QUERY_STRING
Pour cela, on appelle :
- la variable boite, ce qui a pour conséquence de mettre l'adresse de la variable sur la pile
- la variable lg dont on empile le contenu par "lg @"
- le mot type qui affiche les lg caractères contenus à l'adresse débutant à l'adresse "boite"
boite lg @ type

1.4. Récupération :

Elle se fait à l'aide du simple mot "getenv"
En Forth tout passe par la pile, et donc il est nécessaire de représenter de façon symbolique les effets sur la pile.
On utilise la représentation suivante :
( pile_avant -- pile_après )
Pour le mot "getenv" et pour notre exemple, on a
( adresse_de_QUERY_STRING longueur_de_QUERY_STRING -- adresse_contenu_saisie longueur_contenu_saisie )
Ceux qui ont lu jusqu'ici avec attention comprendront donc :
boite lg @ getenv

1.5. Vérifications :

De l'état de la pile :
.s
liste les valeurs contenues, sans les détruire. Important pour la mise au point, parce qu'en cas d'échec, la valeur est zéro.
type
affiche ce que l'on a récupéré, à partir du contenu de la pile : adresse_contenu_saisie longueur_contenu_saisie

Voilou :-)
Je suis arrivé au point où :
- je peux récupérer sur le serveur des saisies en ligne via des formulaires HTML et les enregistrer dans des fichiers texte (pour le moment j'esquive le stockage dans MySQL)
- je peut générer à la volée des pages web à partir de ces fichiers texte.
Il est donc raisonnable d'envisager la réalisation d'un site web dynamique en utilisant Forth comme langage de script.

Pour mémoire, ce langage peut fonctionner en mode interprété (comme Perl, Basic ou PhP) mais aussi en mode compilé (où il devrait aller fabuleusement vite).
Ce qui devrait vous éclairer sur les raisons de ce travail.

2. Les scripts


2.1. Script bash annexe :

#!/bin/sh
echo "Content-Type: text/plain"
echo
echo "Vous avez cliqué sur le bouton Valider"
echo
./cuicui2.fs

2.2. Script Gforth :

#! /usr/local/bin/gforth
256 Constant max-line
Create boite  max-line allot
variable lg    0
: affecte  ( adr1 u adr2 -- )   swap dup lg ! cmove ;
s" QUERY_STRING" boite affecte
boite lg @ type
boite lg @ getenv
.s
type
bye


Haut de page