 |
Una de las funciones más importantes de los cgis es el proceso datos ingresados por el visitante
mediante rellenar un formulario. Es el propósito de este capítulo entregar las herramientas necesarias
para poder recibir estos datos.
El CGI puede recibir el contenido de un formulario de dos maneras básicas:
- Mediante la variable de ambiente QUERY_STRING
- Mediante la entrada éstandar en cuyo caso la variable de ambiente CONTENT_LENGTH nos indicará
el largo del string que deberemos leer.
Cúal de las dos formas se usa dependerá del método que se haya seleccionado en el parametro
method del tag form del documento HTML.
Para enterarnos de cúal de método fúe usado se deberá consultar la variable de ambiente
REQUEST_METHOD que contendrá GET o POST según sea el
caso.
 |
Las principales diferencias entre ambos métodos se ve en esta tabla:
GET
|
POST
|
El CGI lo recibe por medio de una variable de entorno lo que
significa una restricción en el tamaño de los datos.
|
El CGI lo recibe por medio de la entrada estandard (como
si fuera teclado) lo que
significa virtualmente recibir cualquier tamaño de datos.
|
El Browser envía los datos visiblemente haciendo una llamada de
la forma: .../cgi-bin/cgi.pl?campo=algo
Es la forma como se llaman cgis desde fuera de un formulario,
por ejemplo los contadores de visitas son habitualmente llamados de
la forma:
<img src="Count.cgi?df=cgimaster2">
siendo el resultado:
|
El Browser envia los datos directamente al CGI por lo cual
no se ven en el browser (ideal para campos ocultos)
|
Al hacer un reload (recarga) de la página el browser pasará los parámetros
automáticamente.
|
Al hacer un reload (recarga) de la página el browser pasará los parámetros
previa confirmación
|
|
En ambos casos se recibe un string con pares ordenados en la forma:
nombre=valor separados por un signo &
los espacios serán pasados como un signo más (+) y los caráctes especiales (incluyendo el espacio) en la forma:
%valor hexadecimal
Por ejemplo el string: mañana comeré será recibido como:
ma%F1ana+comer%E9
Para ilustrar como procesar estos datos usaremos el programa form.c que
muestra el contenido de los datos pasados desde el browser.
Para que el programa funcione adecuadamente utiliza
cgi forms que puedes usar sin restricción legal alguna.
|
#include <stdio.h>
#include "cgiforms.h"
#define LARGO_MAXIMO 1024
void imprimeVariable( char *lpzNombre );
main(){
/* **** */
printf("Content-Type: text/html\n\n");
printf("<html><body bgcolor=#ffffff text=#ffffff>\n");
printf("<p align=center><table cellpadding=4 bgcolor=000000>\n");
printf("<tr><td color=000080 align=center>");
printf("<b>Campos recibidos desde el Form</b></td></tr>\n");
imprimeVariable( "nombre" );
imprimeVariable( "color" );
imprimeVariable( "pais" );
imprimeVariable( "preferencia" );
imprimeVariable( "marca" );
printf("</table>\n");
printf("</body></html>");
return( 0 );
}
void imprimeVariable( char *lpzNombre ){
/* *************************************
recibe el nombre de la variable y
la imprime formateada como celdas de
una tabla
************************************* */
char lpzResultado[LARGO_MAXIMO];
printf("<tr>\n");
printf("<td bgcolor=\"#9999FF\" valign=top>%s</td>\n",Nombre);
printf("<td bgcolor=\"#DDDDFF\" valign=top><font color=#000000>");
/*
*********************
aqui pide la variable
y luego la imprime
*********************
*/
formPideVariable( lpzNombre,lpzResultado,LARGO_MAXIMO);
printf("[%s]",lpzResultado);
printf("</td>\n");
printf("</tr>\n");
}
|
 |
En algunos casos un cgi puede recibir varias ocurrencias de un mismo parámetro (por ejemplo
cuando se usan selects múltiples).
En esos casos formPideVariable sólo recupera la primera ocurrencia. En caso
de necesitarse leer mas de una ocurrencia puedes usar formPideVariableMultiple que agrega un
cuarto parámetro que indica cual en especial debe rescatarse ( partiendo desde 0 ).
Ej:
i = 0;
while( formPideVariableMultiple( "campo", lpzReceptor, 125, i ) != -1 )
{
printf("-->%i: %s", i, lpzReceptor );
i++;
}
Esta función ha sido agregada el 27 de Diciembre de 1999, si posees una versión
anterior de cgiforms.h baja la actualización.
|
|