Controles en formularios

Esta lección comenta los aspectos de los formularios con respecto al procesamiento de los datos. Para conocer los aspectos de los formularios con respecto a su apariencia y navegación, se puede consultar la lección sobre formularios en los apuntes de HTML y CSS.

¡Atención!Falta comentar los nuevos controles introducidos en HTML 5 y HTML 5.1.

Explicación previa

Para que un control envíe información es necesario:

El siguiente ejemplo muestra un formulario válido (ejemplo.html):

<form action="ejemplo.php">
  <p>Nombre: <input type="text" name="nombre" /></p>
  <p><input type="submit" value="Enviar" /></p>
</form>

Nombre:

El programa que recibe los datos los guarda automáticamente en la matriz $_REQUEST. Mediante la orden print_r($_REQUEST) se puede mostrar el contenido de la matriz $_REQUEST.

El siguiente ejemplo muestra lo que escribiría el programa PHP (ejemplo.php) si recibiera la información del formulario anterior (ejemplo.html).

<?php
print "<pre>";
print_r($_REQUEST);
print "</pre>\n";
?>
Array
(
    [nombre] => Pepito Conejo
)

El nombre del elemento de la matriz $_REQUEST coincide con el nombre del control (atributo name)en el formulario (excepto en el control de tipo imagen).


En los ejemplos que se encuentran en esta página, cada ejemplo muestra el código fuente de la página html, el aspecto que tiene el control y el contenido de la matriz $_REQUEST cuando se recibe la información.


Atributo method

El atributo method de la etiqueta <form> permite elegir si la información de los controles se incluye en la llamada a la página (method="get") o se proporciona posteriormente (method="post"). Si el atributo no está definido, la información se incluye. Desde el punto de vista de la seguridad ambos métodos son equivalentes.

La diferencia es que con el valor get se pueden ver en la barra de dirección los nombres de los controles y los valores introducidos por el usuario, mientras que con el valor post no, pero los datos recibidos son idénticos.


En caso de que haya varios controles que envíen información en un formulario con get, los nombres y valores aparecen en la barra de dirección separados por el carácter ampersand (&), como nombre1=valor1&nombre2=valor2&...

<form action="ejemplo.php" method="get">
  <p>Nombre: <input type="text" name="nombre" /></p>
  <p>Apellidos: <input type="text" name="apellidos" /></p>
  <p><input type="submit" value="Enviar" /></p>
</form>

Ejemplo de formulario

print "<pre>";
print_r($_REQUEST);
print "</pre>";

Resultado de formulario con method get

Botón Enviar (input submit, button)

Este control se puede crear con la etiqueta <input> o con la etiqueta <button>. En ambos casos, este control se envía siempre que esté definido el atributo name y el valor enviado es el valor del atributo value o el contenido de la etiqueta.

Código fuente
Control
$_REQUEST
<input type="submit" value="Submit" />
Array
(
)
<input type="submit" value="Enviar" name="boton2" />
Array
(
    [boton2] => Enviar
)
Código fuente
Control
$_REQUEST
<button type="submit">Submit</button>
Array
(
)
<button type="submit" name="boton3">Enviar</button>
Array
(
    [boton3] => Enviar
)
<button type="submit" name="boton4" value="enviado">Enviar</button>
Array
(
    [boton4] => enviado
)

Normalmente no se suele dar el atributo name al botón enviar ya que la información se envía cuando se hace clic en el botón. pero en algunos casos si que puede ser conveniente. Por ejemplo cuando el formulario contiene varios botones y queremos saber cuál se ha pulsado, como en el ejemplo siguiente, en el que los atributos name son iguales, pero los atributos value son distintos:

ejemplo.html

<form action="ejemplo.php" method="get">
  <p>¿Sí o no?</p>
  <p><input type="submit" name="respuesta" value="Sí" /></p>
  <p><input type="submit" name="respuesta" value="No" /></p>
</form>

Ejemplo de formulario

ejemplo.php

print "<pre>";
print_r($_REQUEST);
print "</pre>";

Resultado de formulario con method get

Caja de texto, caja de contraseña y área de texto (input text, input password, textarea)

Este control se envía siempre. El valor enviado es el contenido de la caja o área.

Código fuente
Control
$_REQUEST
<input type="text" name="cajatexto1" />
Array
(
    [cajatexto1] =>
)
<input type="text" name="cajatexto2" value="Cualquier cosa" />
Array
(
    [cajatexto2] => Cualquier cosa
)
<input type="password" name="cajapassword1" />
Array
(
    [cajapassword1] =>
)
<input type="password" name="cajapassword2" value="pezespada" />
Array
(
    [cajapassword2] => pezespada
)
<textarea rows="4" cols="20" name="areadetexto1"></textarea>
Array
(
    [areadetexto1] =>
)
<textarea rows="4" cols="20" name="areadetexto2">Cualquier cosa</textarea>
Array
(
    [areadetexto2] => Cualquier cosa
)

Casilla de verificación (input checkbox)

Este control se envía solamente si se marca la casilla. El valor enviado es "on" si la casilla no tiene definido el atributo value o el valor del aributo value si éste está definido.

Código fuente
Control
$_REQUEST
<input type="checkbox" name="casilla1" />
(sin marcar)
Array
(
)
<input type="checkbox" name="casilla2" />
(marcada)
Array
(
    [casilla2] => on
)
<input type="checkbox" name="casilla3" value="Tres" />
(marcada)
Array
(
    [casilla3] => Tres
)

Botón radio (input radio)

Este control se envía solamente si se marca alguno de los botones radio que forman el control. El valor enviado es "on" si el botón marcado no tiene definido el atributo value o el valor del atributo value si éste está definido.

Código fuente
Control
$_REQUEST
<input type="radio" name="radio1" />
<input type="radio" name="radio1" />
(sin marcar)
Array
(
)
<input type="radio" name="radio2" />
<input type="radio" name="radio2" />
(marcado uno)
Array
(
    [radio2] => on
)
<input type="radio" name="radio3" />
<input type="radio" name="radio3" />
(marcado otro)
Array
(
    [radio3] => on
)
<input type="radio" name="radio4" value="Uno" />
<input type="radio" name="radio4" value="Dos" />
(marcado uno)
Array
(
    [radio4] => Uno
)
<input type="radio" name="radio5" value="Uno" />
<input type="radio" name="radio5" value="Dos" />
(marcado otro)
Array
(
    [radio5] => Dos
)

Menú (select)

Este control envía siempre la opción elegida. El valor enviado es el contenido de la etiqueta option elegida si la opción elegida no tiene definido el atributo value o el valor del aributo value si éste está definido.

Si el menú admite selección múltiple, entonces el nombre del menú debe acabar con corchetes ([]) y se envía como una matriz, de tantos elementos como opciones se hayan elegido.

Código fuente
Control
$_REQUEST
<select name="menu1">
  <option></option>
</select>
Array
(
    [menu1] =>
)
<select name="menu2">
  <option>Opción 1</option>
  <option>Opción 2</option>
</select>
Array
(
    [menu2] => Opción 1
)
<select name="menu3">
  <option value="Uno">Opción 1</option>
  <option value="Dos">Opción 2</option>
</select>
Array
(
    [menu3] => Uno
)
<select name="menu4[]" size="3" multiple="multiple">
  <option>Opción 1</option>
  <option>Opción 2</option>
  <option>Opción 3</option>
  <option>Opción 4</option>
</select>

(Marcados 1 y 3)
Array
(
    [menu4] => Array
        (
            [0] => Opción 1
            [1] => Opción 3
         )
)

Control oculto (input hidden)

Este control se envía siempre y el valor enviado es el valor del atributo value.

Código fuente
Control
$_REQUEST
<input type="hidden" name="oculto1" />
Array
(
    [oculto1] =>
)
<input type="hidden" name="oculto2" value="Cualquier cosa" />
Array
(
    [oculto2] => Cualquier cosa
)

Imagen (input image)

El control de tipo imagen inserta una imagen que funciona como un botón (aunque ni Firefox ni Internet Explorer le da relieve como a los botones). Al hacer clic en un punto de la imagen es como si se hubiera pulsado a un botón submit y se envían las coordenadas del punto en el que se ha hecho clic (junto con los valores de los otros controles del formulario).

El origen de las coordenadas es el extremo superior izquierdo de la imagen. El valor X aumenta a medida que nos desplazamos a la derecha y el valor Y aumenta a medida que nos desplazamos hacia abajo.

Código fuente
Control
$_REQUEST
<input type="image" name="gnu" alt="Logotipo GNU" src="gnu.jpg" />
Array
(
    [gnu_x] => 89
    [gnu_y] => 111
)

Las coordenadas se reciben en $_REQUEST en dos elementos que añaden al nombre del control el sufijo _x e _y. En la barra de dirección el nombre aparece con el sufijo .x e .y.

Control de tipo image

Si se define el atributo value, el formulario debe enviar tanto las coordenadas como el nombre del control con el valor del atributo value. Actualmente (octubre de 2016), Google Chrome sí que lo hace, pero Firefox e Internet Explorer no lo hacen.

Archivo (input file)

El selector de archivo permite enviar un archivo desde el ordenador del cliente al servidor.

En un formulario "normal", este control se envía siempre y el valor enviado es el nombre del archivo elegido.

Código fuente
Control
$_REQUEST
<input type="file" name="archivo1" />
Array
(
    [archivo1] => loquesea.txt
)

Para que este control envíe toda la información, el formulario debe tener el atributo enctype con el valor multipart/form-data y ser enviado con el método POST. La información se almacena entonces en la matriz $_FILES (pero no en la variable $_REQUEST).

Código fuente
Control
$_FILES
<form enctype="multipart/form-data"
  action="ejemplo.php" method="post" >
<input type="file" name="archivo2" />
Array
(
    [archivo2] => Array
        (
          [name] => loquesea.txt
          [type] => text/plain
          [tmp_name] => C:\ejemplos\loquesea.txt
          [error] => 0
          [size] => 27890
        )
)

Antes de utilizar este control, hay que configurar en el archivo php.ini el tamaño máximo de los archivos que se pueden enviar (mediante la directiva post_max_size) y es conveniente leer el capítulo correspondiente a la subida de archivos del manual de PHP para conocer la manera de evitar los posibles riesgos de seguridad.

En la lección Cargar archivos se comenta un poco más el uso de este control.