Cuando se envía un formulario, PHP almacena la información recibida en una matriz llamada $_REQUEST. El número de valores recibidos y los valores recibidos dependen tanto del formulario como de la acción del usuario.
Cualquier control se envía solamente si está establecido su atributo name. El atributo name del control puede contener cualquier carácter (números, acentos, guiones, etc), pero si contiene espacios, los espacios se sustituyen por guiones bajos (_). Cada control crea un elemento de la matriz $_REQUEST, que se identifica como $_REQUEST[valor_del_atributo_name] y que contiene el valor entregado por el formulario (en su caso).
El siguiente ejemplo muestra un ejemplo de formulario:
<form action="ejemplo.php"> <p>Nombre: <input type="text" name="nombre" /></p> <p><input type="submit" value="Enviar" /></p> </form> |
Nombre:
|
Mientras se está programando, para comprobar que el fichero php está recibiendo la información enviada por el control, lo más fácil es utilizar la función print_r($matriz) que muestra el contenido de la matriz $_REQUEST. Una vez se ha comprobado que la información llega correctamente, la línea se debe comentar o eliminar.
El siguiente ejemplo muestra lo que escribiría el programa PHP si recibiera la información del formulario anterior.
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Array ( [nombre] => Pepito Conejo) Tu nombre es Pepito Conejo |
Al hacer referencia a los elementos de la matriz $_REQUEST, hay que tener en cuenta si la referencia se encuentra dentro de una cadena o fuera de ella.
<?php print "<p>Tu nombre es $_REQUEST['nombre']</p>"; ?> |
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ejemplo.php on line 2 |
<?php print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Tu nombre es Pepito Conejo |
<?php print "<p>Tu nombre es ".$_REQUEST[nombre]."</p>"; ?> |
Notice: Use of undefined
constant texto - assumed 'texto' in ejemplo.php
on line 2 Tu nombre es Pepito Conejo |
<?php print "<p>Tu nombre es ".$_REQUEST['nombre']."</p>"; ?> |
Tu nombre es Pepito Conejo |
La mayoría de controles aparecen en la matriz $_REQUEST aunque el usuario no escriba nada en el formulario. El valor almacenado es una cadena vacía, pero está definida. Si el programa supone que se ha introducido algún valor, el resultado puede confundir al usuario ...
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Array ( [nombre] => ) Tu nombre es |
... por lo que conviene incluir una estructura if ... else que considere la posiblidad de que no se haya escrito nada en el formulario:
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; if ($_REQUEST[nombre]=="") print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Array ( [nombre] => ) No has escrito tu nombrecor |
Sin embargo, las casillas de verificación y los botones radio solamente están definidos en la matriz $_REQUEST si se han marcado en el formulario. Por ejemplo, si en el siguiente formulario:
<form action="ejemplo.php"> <p>Deseo recibir información: <input type="checkbox" name="acepto" /></p> <p><input type="submit" value="Enviar" /></p> </form> |
Deseo recibir información:
|
... el usuario no marca la casilla, la matriz $_REQUEST no contiene ningún dato:
Deseo recibir información:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; ?> |
Array ( ) |
Y al pretender utilizar el valor, se produce un aviso por utilizar un índice no definido:
Deseo recibir información:
|
<?php print "<p>$_REQUEST[acepto]</p>\n"; ?> |
Notice: Undefined index: acepto in ejemplo.php on line 2 |
Este problema se resuelve comprobando que el índice está definido antes de hacer referencia a él, utilizando la función isset($variable), que admite como argumento una variable y devuelve 1 (Verdadero) si existe y 0 (Falso) si no existe.
Deseo recibir información:
|
<?php if (isset($_REQUEST['acepto'])) print "<p>Deseas recibir información</p>"; else print "<p>No deseas recibir información</p>"; ?> |
No deseas recibir información |
Deseo recibir información:
|
<?php if (isset($_REQUEST['acepto'])) print "<p>Deseas recibir información</p>"; else print "<p>No deseas recibir información</p>"; ?> |
Deseas recibir información |
En realidad es conveniente efectuar siempre la verificación de existencia, para prevenir los casos en que un usuario intente acceder a la página php sin pasar por el formulario.
Un usuario puede insertar código html en la entrada de un formulario, lo que puede acarrear comportamientos inesperados y riesgos de seguridad. El siguiente ejemplo solamente perjudicaría al aspecto de la página.
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Array ( [nombre] => ) Tu nombre es Pepito Conejo |
Para evitarlo, se puede utilizar la función strip_tags($cadena), que elimina todas las etiquetas html, como en el siguiente ejemplo.
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; print "<p>Tu nombre es".strip_tags($_REQUEST['nombre'])."</p>"; ?> |
Array ( [nombre] => ) Tu nombre es Pepito Conejo |
Otra función que conviene aplicar a culaquier entrada de formulario es la función trim($cadena), que elimina los espacios en blanco iniciales y finales y devuelve la cadena sin esos espacios.
Por ejemplo, si en el ejemplo siguiente, el usuario introduce varios espacios en blanco en vez de su nombre, la comprobación no serviría para nada ya que la cadena con espacios en blanco no es una cadena vacía
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; if ($_REQUEST['nombre']=="") print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es $_REQUEST[nombre]</p>"; ?> |
Array ( [nombre] => ) Tu nombre es |
Sin embargo, si se aplica la función trim(), la cadena introducida queda reducida a la cadena vacía y la comprobación la detecta:
Nombre:
|
<?php print "<p>"; print_r ($_REQUEST); print "</p>\n"; if (trim($_REQUEST['nombre']=="")) print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es ".trim($_REQUEST['nombre'])."</p>"; ?> |
Array ( [nombre] => ) No has escrito ningún nombre |
Si aplicamos las medidas mínimas de seguridad comentadas en el punto anterior, cualquier referencia a $_REQUEST[control] debería sustiutirse por trim(strip_tags($_REQUEST[control])). Si además queremos comprobar si el control está definido, el código se complica.
La solución es guardar los valores de la matriz $_REQUEST en variables y realizar todas las comprobaciones al definir esas variables. En el resto del código basta con utilizar la variable en vez del elemento de la matriz $_REQUEST.
Nombre:
|
<?php if (isset($_REQUEST['nombre'])) $nombre = trim(strip_tags($_REQUEST['nombre'])); else $nombre = ""; if ($nombre=="") print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es $nombre</p>"; ?> |
Array ( [nombre] => ) No has escrito ningún nombre |
Nombre:
|
<?php if (isset($_REQUEST['nombre'])) $nombre = trim(strip_tags($_REQUEST['nombre'])); else $nombre = ""; if ($nombre=="") print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es $nombre</p>"; ?> |
Array ( [nombre] => ) Tu nombre es Pepito Conejo |
La asignación de la variable se puede realizar en una sola línea, utilizando la notación abreviada: (condición) ? verdadero : falso;:
Nombre:
|
<?php $nombre=(isset($_REQUEST['nombre']))?trim(strip_tags($_REQUEST['nombre'])):""; if ($nombre=="") print "<p>No has escrito ningún nombre</p>"; else print "<p>Tu nombre es $nombre</p>"; ?> |
Array ( [nombre] => ) Tu nombre es Pepito Conejo |