inicio anterior siguiente

Procesamiento de Formularios
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.

bajar
#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");

}


Ejemplo de Formulario

Se ha elegido el metodo get para que se note de mejor modo la forma de traspasar los datos.
Nombre
Color
País
Preferencia Linux AS/400 Windows NT
¿Desea dejar su marca? Si, por supuesto.

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.


 

inicio anterior siguiente