Procesar variables de formularios

Valoración del artículo:
Veremos cómo transferir variables de una página a otra por medio de formularios
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Este tipo de transferencia es de gran utilidad ya que nos permite interaccionar directamente con el usuario.

El proceso es similar al explicado para las URLs. Primeramente, presentamos una primera página con el formulario clásico a rellenar y las variables son recogidas en una segunda página que las procesa:

Nota: No siempre se definen automáticamente las variables recibidas por el formulario en las páginas web, depende de una variable de configuración de PHP: register_globals, que tiene que estar activada para que así sea. Ver comentarios del artículo al final de la página para más información.

<HTML>
<HEAD>
<TITLE>formulario.html</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="destino2.php">
Nombre<br>
<INPUT TYPE="TEXT" NAME="nombre"><br>
Apellidos<br>
<INPUT TYPE="TEXT" NAME="apellidos"><br>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>

<HTML>
<HEAD>
<TITLE>destino2.php</TITLE>
</HEAD>
<BODY>
<?
echo "Variable \$nombre: $nombre <br>\n";
echo "Variable \$apellidos: $apellidos <br>\n"
?>
</BODY>
</HTML>

$HTTP_POST_VARS

Recordamos que es posible recopilar en una variable tipo array el conjunto de variables que han sido enviadas al script por este método a partir de la variable de sistema $HTTP_POST_VARS.

echo "Variable \$nombre: " . $HTTP_POST_VARS["nombre"] . "<br>\n";

Nota: Aunque podamos recoger variables con este array asociativo o utilizar directamente las variables que se definen en nuestra página, resulta más seguro utilizar $HTTP_POST_VARS por dos razones, la primera que así nos aseguramos que esa varible viene realmente de un formulario y la segunda, que así nuestro código será más claro cuando lo volvamos a leer, porque quedará especificado que esa variable estamos recibiéndola por un formulario.

$_POST

A partir de PHP 4.1.0 se pueden recoger las variables de formulario utilizando también el array asociativo $_POST, que es el mismo que $HTTP_POST_VARS, pero más corto de escribir.

Ejemplo de restricción de acceso por edad

Para continuar aportando ejemplos al uso de formularios vamos a realizar una página que muestra solicita la edad del visitante y, dependiendo de dicha edad, permita o no visualizar el contenido de la web. A los mayores de 18 años se les permite ver la página y a los menores no.

El ejemplo es muy sencillo y no valdría tal cual está para utilizarlo a modo de una verdadera restricción de acceso. Únicamente nos sirve para saber cómo obtener datos de un formulario y como tratarlos para realizar una u otra acción, dependiendo de su valor.

La página del formulario, que hemos llamado edad.php tendría esta forma:

<html>
<head>
  <title>Restringir por edad</title>
</head>

<body>

<form action="edad2.php" method="post">
Escribe tu edad: <input type="text" name="edad" size="2">
<input type="submit" value="Entrar">
</form>

</body>
</html>

Esta es una página sin ningún código PHP, simplemente tiene un formulario. Fijémonos en el action del formulario, que está dirigido hacia una página llamada edad2.php, que es la que recibirá el dato de la edad y mostrará un contenido u otro dependiendo de ese valor. Su código es el siguiente:

<html>
<head>
   <title>Restringir por edad</title>
</head>

<body>

<?
$edad = $_POST["edad"];
echo "Tu edad: $edad<p>";

if ($edad < 18) {
   echo "No puedes entrar";
}else{
   echo "Bienvenido";
}
?>
</body>
</html>

Esperamos que este otro código tampoco resulte extraño. Simplemente se recibe la edad, utilizando el array $_POST. Luego se muestra la edad y se ejecuta una expresión condicional en función de que la edad sea menor que 18. En caso positivo (edad menor que 18), se muestra un mensaje que informa de que no se deja acceder al página. En caso negativo (mayor o igual a 18) se muestra un mensaje de bienvenida.

Podemos ver el ejemplo en funcionamiento.

Comentarios
Fueron enviados 28 comentarios al artículo
5 comentarios no revisados
23 comentarios revisados:
Por: Mon
25/12/01
He copiado tal cual estos dos ejemplos en dos archivos de mi directorio htdocs (tal y como hago con todos mis documentos php) y al ejecutarlo me sale la página formulario.html tal y como es de esperar, pero en la página destino2.php no me sale el valor de las variables (sólo me sale el texto de nombre y apellidos).
¿A caso tengo que activar algo o tener alguna librería o extensión activada para que esto me funcione?

RESPUESTA:

Pues si que hay que configurarlo en determinados casos, porque en ocasiones no viene hecho por defecto. Para ello debes acceder al archivo php.ini.

La variable que tienes que configurar es "register_globals" (se le asigna "on" o bien "off") que, si está activada, la información de entrada de GET, POST y de las cookies se declara automáticamente como variables que se ueden utilizar directamente. Además, se puede encontrar en las matrices asociativas $HTTP_GET_VARS,$HTTP_POST_VARS y $HTTP_COOKIE_VARS respectivamente.

Por: Alberto Luis Garcia
11/5/02
Estuve estudiando el codigo de la pagina y esta muy bien, el problema se presenta es en el archivo php.ini, en el cual se encuentra la instruccion register_globals = Off, he aqui el problema, esto esta impidiendo el paso de variables globales, por lo tanto se debe habilitar o activar de la siguiente forma: register_globals = On, luego salvar los cambios y verificar otra vez las aplicaciones que te muestran error.

para hallar el archivo php.ini utiliza la busqueda en el sistema y luego realiza los pasos dichos anteriormente.

Por: antonio borquez
30/5/02
¿como puedo procesar varios formularios de una sola vez con PHP?,si no se puede en PHP en que otro lenguaje. Esta duda me surge porque estoy desarrollando un formulario tipo orden de compra en cual incluye un numero variable de detalles(articulos) y tuve que separarlo en dos frames para visualizarlo en forma completa; pero para procesarlos tengo que ocupar 2 botones SUBMIT..

Posible solución:

Que yo sepa, no puedes enviar a una página dos formularios... pero se me ocurre que copies el contenido de un formulario en el otro dinámicamente con Javascript en el cliente y que mandes únicamente un formulario, el que guarda sus datos y la copia de lo que había en el otro formulario.

Para ello, en el formulario donde copiarás los datos del otro formulario coloca tantos campos hidden como campos debes copiar. Luego, con el evento onsubmit de javascript detectas el momento en el que envías el formulario "grande" y copias todos los datos del otro formulario, accediendo, en tu caso, por la jerarquía de objetos al otro frame y al formulario que deseas copiar.

Algún día puede que expliquemos esto detalladamente.

Por: cesar
17/7/02
Muchisimas gracias por el apunte de cambiar la variable register_globals a on, ya me estaba volviendo loco. Muchas gracias
Por: Adhemar
16/8/02
Existe un grave problemilla con la configuracion de la variable register globals en ON ya que en su pagina web PHP recomienda que la dejemos en OFF y utilicemos funciones y variable predefinidas conocidas como SUPERGLOBALS. Esto se aplica para versiones 4.20+.

He aqui la pagina: www.php.net/manual/en/configuration.php#ini.register-globals

Chau

Por: Cesar DE Chile
23/8/02
Estimados... y para este mismo ejemplo, como lo puedo hacer para que esas variables del formulario html queden en otro formulario y no en una pagina normal? como deberia crear la pagina2? gracias

RESPUESTA:

Lo que tendrias que hacer es crear tu formulario en html como haces habitualmente, colocando el valor recibido por el formulario precedente como atributo "value".
Por ejemplo:
<INPUT TYPE="TEXT" NAME="apellidos" value="<?echo $apellidos?>">

Tienes un ejemplo desarrollado de esto en el siguiente articulo:
http://www.desarrolloweb.com/articulos/350.php?manual=14
Por: Cesar
06/10/02
Excelente los ejemplos. Tengo un problema. De una pagina ingreso.htm por medio de formulario capturo datos que quiero pasarlo a otra que tiene 3 marcos(frames). No puedo pasar esos datos a cada una de las paginas que tienen esos tres marcos.

RESPUESTA

Si quieres que el formulario se envíe a un marco (o frame) que no es el que está el formulario, debes utilizar el atributo target en la etiqueta form, del mismo modo que lo utilizas en los enlaces.

Si lo que deseas es pasar la información a tres marcos distintos, deberías utilizar Javascript. En el formulario, en lugar de colocar un botón de submit, colocas un botón normal que, al pulsarlo, se llame a una función javascript que mande los datos a los tres marcos. Eso lo consigues con un código parecido a este:

<script>
//Digamos que el formulario se llama form1
//Digamos que los frames se llaman f1, f2 y f3
document.form1.target="f1"
document.form1.submit()
document.form1.target="f2"
document.form1.submit()
document.form1.target="f3"
document.form1.submit()
</script>

Por: flipis
07/12/02
En teoría hay tres métodos de recoger variables desde un formulario:
  1. Activando register_globals = On en el fichro php.ini. En este caso, un campo llamado "nombre", el el formulario, sería referido como $nombre en el script que recibe el formulario.
  2. En php 4.1.1 y anteriores, usamos los arrays asociativos (que tienen índices de texto en vez de índices numéricos), $HTTP_POST_VARS[], $HTTP_GET_VARS[], $HTTP_COOKIE_VARS[], $HTTP_SESSION_VARS[]
    Así, en el ejemplo anterior, nos referiríamos a $HTTP_POST_VARS["nombre"] o a $HTTP_GET_VARS["nombre"]
    Las mayúculas son imprescindibles, no vale $http_post_vars[]
  3. En php 4.1.2 y posteriores, hay unso nuevos arrays, que se comprotan más o menos igual que los anteriroes. Son $_POST[], $_GET[], $_SESSION[], $_COOKIE[]
    Así, en nuestro ejemplo, sería $_POST["nombre"] o $_GET["nombre"]
Espero que te ayude

fLIPIS (www.flipis.net)

Por: Alejandro Palacios
11/2/03
el hecho de cambiar register_globals a modo "on" , ¿Como puede ser afectada la seguridad?

RESPUESTA

Si las variables que llegan por un formulario se declaran automáticamente en la página podría ocurrir que un visitante "avispado" modificase a mano la lista de variables pasadas por la URL con intención de crear alguna variable necesaria para realizar algún tipo de acción, posiblemente no autorizada, en nuestro sitio web.

No se si la idea queda clara, pero en el supuesto de que nosotros estuviéramos utilizando una variable de sesión, llamada autorizado y con valor “si”, para saber si un usuario se ha autentificado correctamente, un posible atacante podría introducirla a través de la URL.

www.tudominio.com/pagina.php?autorizado=si

El tema es que, por motivos de seguridad, se recomienda acceder a cada variable de servidor (Variables de sesión, de fomularios, pasadas en la URL, etc.) indicando las vías por las que ha sido declarado, por ejemplo:

HTTP_POST_VARS
HTTP_GET_VARS …

Aunque a partir de determinada versión de PHP se puede acceder también por las abreviaciones:

_GET
_SESSION
_COOKIE
...

Por: javi
24/6/03
Quería hacer un comentario sobre el $_POST y el $_GET, que espero sirva de ayuda para alguno. La cuestion es que estos pueden ser usados desde cualquier funcion o metodo sin declararlos como globals :) cosa que con los $HTTP_GET_VARS, $HTTP_POST_VARS no se podía.
Por: Ramón Sánchez
24/10/03
Cuando se vaya a modificar el fichero php.ini para poner la variable register_globals = On debéis tener la precaución de además de hacerlo en el directorio de la instalación del php, después volver a copiar el fichero php.ini en el directorio de sistema (Windows, WinNT,...)que es de donde realmente se activa.
Si sólo la activas en el directirio de instalación es como el que tenía un tío en Graná, que ni tenía tío ni tenía na. Salu2.
Por: Spikemxl
27/9/04
Yo tenia el mismo problema enviaba variables por un formulario y no me los imprimia entonces puse register_globals = On y si me funciono pero leo que hay un problema en la seguridad entonces como se usa haciendo uso de HTTP_VARS?

RESPUESTA:

Realmente existe ese problema de seguridad, porque puedes tener una variable definida dentro de PHP que se haya creado sin que tú la hayas definido, simplemente porque el visitante haya compuesto una URL con paso de parámetros.

En cualquier caso, sì puedes evitar el register globals, mejor. En ese caso, el acceso a las variables se haría así:

$HTTP_POST_VARS["nombre_variable"]
$_POST["nombre_variable"]

Cualquiera de las dos formas de acceder a la variable es correcta. Pero la forma abreviada sólo funciona en versiones de PHP más modernas, aunque lo habitual es que cualquier proveedor tenga instalada una versión de PHP actualizada que permita la forma $_POST["nombre_variable"].

Por: ivan
29/9/04
Que tal esta sentencia les gusta ...a mi si me ayuda para manejo de variables por seguridad sin ningun problem ...
bye ...
<?PHP IMPORT_REQUESTE_VARIABLES("PQC","")?>
Por: Emilio
01/10/04
Por lo que he probado, al usar dobles comillas en las variables con $HTTP_POST_VARS o $_POST da error. Es decir, en vez $_POST["nombre_variable"] (que da error), se usaria $HTTP_POST_VARS[nombre_variable]

Respuesta

Me extraña mucho lo que dices... no creo que estés en lo cierto. La sintaxis correcta es con las dobles comillas.

¿En qué condiciones te da el error?

En algunos casos, si estás escribiendo código dentro de unas comillas, puede que con las comillas del $_POST se creen sintaxis incorrectas que puedan dar errores, pero no puedo entender que siempre te de este error que comentas.

Por: rick
13/2/05
He copiado este ejemplo tal cual, pero al momento de enviar la consulta, en lugar de mostrarme el resultado del archivo destino2.php abriendo esta página en el explorador, me abre una ventana para descargar el archivo destino2.php alguien me puede decir que pasa?

Respuesta

¿Estás seguro que esas páginas están pasando por el servidor web? La dirección de la barra debería mostrar algo empezando por http://.

Por: oscar
19/4/05
capturo los valores de un formulario y necesito pasarlos a otro formulario pero en el cual trabajo con codigo php. el problema es que no puedo imprimir la variable dentro de una caja de texto. espero me puedan ayudar gracias.
Por: Kike
02/9/05
Respecto al comentario de Emilio..
Creo que tiene razón, a mi también me funciono sin comillas $HTTP_POST_VARS[nombre_variable]..
Con comillas me manda error.. será la versión de PHP (es antigua)..
Por: Angela
19/10/05
Claro está que el hecho de configurar las variables globales en ON deja un vacío en la seguridad, pero como pasaría otras variables que no son parte de un formulario sino aquellas que son definidas por el usuario. Que me recomendaría.
Por: jJesus R
09/3/06
Alguien sabe como pasar un arreglo (es decir un array) de una pagina a otra ?.

RESPUESTA

Yo no creo que se pueda pasar directamente. Tendrías que pasar cada uno de los valores del array en una variable aparte. O crear una variable de sesión, donde puedes meter cualquier tipo de dato y este persistirá y podrás leerlo aunque el usuario cambie de página.
Por: Axel
15/8/06
Este capítulo y el anterior fueron mi segundo gran dolor de cabeza después de la instalación y configuración de PHP. Quisiera aportar algunas recomendaciones para no rendirse y morir en el intento.

Mi arquitectura WAMP (Windows, Apache, MySQL, PHP) es la siguiente:

WINDOWS XP
APACHE 2.2.2
MySQL 5.0
PHP 5.1.4

Si tu arquitectura es ésta y te funciona, te recomiendo lo siguiente:

1. No necesitas activar Register_Globals en php.ini (mantener en off).

2. Si lo que deseas es enviar un formulario por URL y estás trabajando tu WEB en localhost debes indicar, en el archivo de origen, la ruta de envío de la siguiente manera:

<form method="GET" action="http://localhost/Webeando/webeando.php">

El método puede ser "GET" o "POST". Ambos funcionan.

Nota: en mi caso tengo el archivo de destino (Webeando.php) en la carpeta 'Webeando' que está dentro de 'htdocs' en Apache. Como ves, indico toda la ruta.

3. En el archivo de destino debes recoger la variable usando $_GET o $_POST (según el método que has escogido) con la siguiente sintaxis según sea el caso:

A. Si deseas recibir únicamente la variable para procesarla según tus nececidades, hazlo como sigue:

//método "GET"
echo $_GET["nombre_variable"]."<br>";

//método "POST"
echo $_POST["nombre_variable"]."<br>";


Nota: La instrucción 'echo' es opcional, pero nos sirve para ver si esto está funcionando. Tú deberás decidir después cómo procesar tus variables.


B. Si lo que deseas es que tu variable aparezca embebida dentro de un texto la sintaxis es esta:

//método "GET"
echo "Mi nombre es: $_GET[nombre_variable]<br>";

//método "POST"
echo "Mi nombre es: $_POST[nombre_variable]<br>";


Nota 1: La diferencia está en la posición de las comillas dobles: Prestar mucha atención en ésto.

Nota 2: GET y POST siempre, siempre, siempre deben ir con mayúscula para que sea reconocida la variable.


Nota 3: La sintaxis antigua $HTTP_GET_VARS o $HTTP_POST_VARS no funciona en esta versión de PHP (al menos no a mí). Recomiendo usar $_GET o $_POST según sea el caso.

Nota 4: Al enviar un formulario, todas las variables declaradas en él quedan automáticamente disponibles en la página de destino.
Por: omar ramirez
28/12/06
en el caso de del script de edad, es posible en lugar de generar el mensaje redirigir hacia otra pagina es decir, ya que tienes 18 años te dirigo hacia el index de mi website.... puede hacerse esto con menu/list, ejemplo el sitio de heineken
Por: LUIS
14/2/07
Tienes toda la razón Axel , los metodos para recibir variables se escriben asi $_POST o $_GET de otra forma, el formulario especificado en el parametro "action" va a arrojar un error de :
Notice: Undefined variable: HTTP_POST_VARS in C:Archivos de programaEasyPHP 2.0b1wwwgrabaf.php on line 12
Variable $nombre:

Espero este comentario ayude

Demons
Posible problema con list() para trocear $_POST
21/9/09
En mi propia versión de la realización del ejemplo, utilicé la función list() para trocear el array $_POST.
Solamente comentar, que la función list() no funciona en los casos en los que el índice del array son Strings, por lo que si por ejemplo, declaramos en el formulario un <input type="text" name="nombre">... $_POST recogerá "nombre"=>"XXXX". La clave "nombre" da error con la función list().. en concreto el error que especifica es:

Undefined offset 0
Undefined offset 1 .. etc.

Un saludo

Manuales relacionados
Categorias relacionadas
El autor
Rubén Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
Lectura recomendada
Últimas noticias
Alojados en el grupo