Un des points inévitables en CGI est le traitement de formulaires. C'est ce que nous allons traiter (sans jeux de mots) dans cette partie.
Méthode GET
La méthode GET, c'est quand les données sont passées dans l'URL. Pour cela, nous allons récupérer une variable environnement qui contient les données avec la fonction
getenv()
, qui est définie dans l'en-tête stdlib.h.
Cette variable environnement est QUERY_STRING, son contenu se présentant sous la forme
mavar=mavaleur&unevar=unevaleur&[...].
Imaginons que nous voulions récupérer deux nombres a et b passés dans l'URL et les multiplier, voici comment procéder :
Code : C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | #include <stdio.h>
#include <stdlib.h> // Ne pas oublier pour getenv()
void haut(char *);
void bas();
int main(void)
{
int a=0, b=0;
printf("Content-Type: text/html;\n\n");
haut("Ma page en C !");
char *data = getenv("QUERY_STRING"); // Les variables
if(data == NULL)
{
printf("<p>Erreur dans le script !</p>");
}
else
{
if(sscanf(data, "a=%d&b=%d", &a, &b) != 2) // On récupère les deux chiffres a et b
printf("<p>Vous devez passer des chiffres en données !");
else
printf("<p>%dx%d = %d ! :)</p>", a, b, a*b);
}
bas();
return 0;
}
|
Et si l'on appelle
http://monsite.com/index.cgi?a=4&b=6, nous nous trouvons bien avec ceci :
Code : Console
Méthode POST
Là, les valeurs sont passées hors de l'URL. Nous les récupérons dans le flux d'entrée
stdin. Au niveau de l'utilisation, on va l'utiliser
comme un fichier déjà ouvert en lecture seule, et qu'on a pas besoin de fermer.
Ces données sont passées sous la même forme que pour la méthode GET :
mon_champs_de_texte=unevaleur&un_textarea=uneautrevaleur.
Si je veux récupérer par exemple un texte entré dans un formulaire, de 80 caractères, dans un champ nommé
data et l'afficher (ou en faire ce qu'on veut, même), voici comment il faudrait procéder :
Code : C 1
2
3
4
5
6
7
8
9
10
11
12 | int main(void)
{
char montexte[80] = "";
printf("Content-Type: text/html;\n\n");
haut("Ma page en C !");
if(fscanf(stdin, "data=%80[^&]s", montexte) < 0)
printf("<p>Le formulaire a été mal rempli !</p>");
else
printf("Voici ce que vous avez écrit : %s", montexte);
bas();
return 0;
}
|
Décoder les données
Si vous avez affiché des chaînes avec des espaces et des caractères dits « spéciaux », vous aurez constaté que pour le commun des mortels, ce n'est pas du tout lisible. Je vous propose donc de décoder cette chaîne avec une fonction.
Pour rendre tout ceci pédagogique, ce sera à vous de la coder (une solution sera proposée).
Il y a donc plusieurs règles :
- Les espaces sont remplacés par des + ;
- Les caractères spéciaux (les +, &, %, les retours à la ligne, etc.) sont remplacés par le signe % suivi de leur code ascii traduit en hexadécimal ;
- Le reste demeure identique.
Et une petite piste, pour récupérer le code sous forme décimale, il suffit de la récupérer avec un
%x dans la fonction sscanf.
Correction
Voici donc le code que je vous propose, mais ce n'est bien sûr pas le
seul qui soit juste.
Code : C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | char *decode(char *str, char *fin)
{
char *dest = strdup(str);
if (dest == NULL)
return NULL;
char *ret = dest;
for (; str < fin && *str != '\0'; str++, dest++)
{
if (*str == '+')
*dest = ' ';
else if (*str == '%')
{
++str;
if (*str == '\0')
break;
int code = '?';
sscanf(str, "%2x", &code);
*dest = code;
str++;
if (*str == '\0')
break;
}
else
*dest = *str;
}
*dest = '\0';
return ret;
}
|
Dans le code de la partie précédent, voici comment on l'utiliserait :
Code : C | printf("Voici ce que vous avez écrit : %s", unencode(montexte, montexte+80));
|