Manual PHP - Proceso de formularios web

Un formulario web consta de una serie de campos identificados por un nombre, y a los que el usuario asigna un valor.

Los campos de un formulario pueden ser de distintos tipos. Los más habituales son:

  • INPUT - Contiene una cadena de texto
  • CHECKBOX / RADIOBUTTON el valor asociado es true si el checkbox/radiobutton está marcado, false en caso contrario
  • SELECT - Permite seleccionar uno o varios valores de una lista de valores posibles
  • TEXTAREA - Contiene una cadena de texto que puede constar de varias líneas

A continuación presentamos el código HTML del formulario que vamos a usar como ejemplo en este artículo.
Se trata de un típico formulario de 'Contacta con Nosotros', para que el usuario pueda enviar solicitudes de información, sugerencias, etc...

Vamos a escribir este código en un fichero llamado 'form-contacto.php':

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Contacta con Nosotros</title>
<style type="text/css">
label,input, select { display: block; width: 220px; float: left; margin-bottom: 10px;}
textarea { display: block; width: 350px; float: left; margin-bottom: 10px;}
label { text-align: right;  width: 95px; padding-right: 20px; font-weight:bold; font-size:83%;}
br {clear: left;}
#subbut {width:100px; margin-top:10px; border:thin solid black; position:relative; left:115px; font-size:70%;}
.req {color:#a00;}
#note {width:180px; color:#a00; margin-left:115px; font-size:83%;}
</style>
</head>
<body>
<h1>Contacta con nosotros</h1>
Envíanos tus comentarios, sugerencias, dudas o solicitudes de información acerca de este sitio
<form method="post" action="proc-contacto.php">
<div>
<label for="nombre">Nombre:</label> <input type="text" name="nombre" id="name"><br>
<label for="email"><span class="req">*</span> Email:</label> <input type="text" name="email" id="email"><br>
<label for="mensaje"><span class="req">*</span> Mensaje:</label>
<textarea name="mensaje" id="mensaje" rows="5" cols="35">
</textarea><br>
<label for="tipos">Tipo de comentario:<br>(Se pueden seleccionar varios)</label>
<select name="tipos[]" multiple id="tipos">
<option value="informar">Informar de enlace no operativo</option>
<option value="sugerencia">Sugerencia sobre el contenido</option>
<option value="otro">Otro</option>
</select>
<br>
<div id="note">*Entradas obligatorias</div>
<input id="subbut" type="submit" value="Enviar">
</div>
</form>
</body>
</html>

En el formulario de arriba se puede observar que el nombre que se le ha dado al campo SELECT es 'tipos[]', finalizado en corchetes cuadrados. Esto le indica al intérprete PHP que cuando procese el argumento debe crear un array, ya que el usuario va a poder seleccionar más de un tipo para un mismo mensaje. El array tipos[] contendrá todos los valores seleccionados del campo SELECT.

Cuando el usuario rellena el formulario y lo envía, el servidor recibe una solicitud que contiene los nombres de los campos y sus valores.

El código que procesa el formulario debe:
 - Obtener los valores de los distintos campos y validarlos
 - Devolver una página de resultado.


1. Obtener los valores de los campos.

Si el método de envío del formulario es POST, el intérprete PHP utiliza el array $_POST para almacenar los valores de los argumentos recibidos.
Del mismo modo, si el método de envío del formulario es GET, el intérprete utiliza el array $_GET.

En nuestro ejemplo, el formulario especifica el método POST, por lo cual vamos a recoger los valores de los campos mediante el siguiente código que guardamos en el fichero proc-contacto.php):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Proceso de Formulario de Contacto</title>
</head>
<?php
//Recoger los datos del formulario
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$mensaje = $_POST['mensaje'];
$tipos=$_POST['tipos'];
$mensaje=stripslashes($mensaje);
?>
<body>
Nombre: <?php echo $nombre ?><br>
Email: <?php echo $email ?><br>
Mensaje: <?php echo $mensaje ?><br>
<?php
for ($i=0; $i<count($tipos); $i++){
echo "tipo: ".$tipos[$i]."<br>";
}
?>
</body>
</html>

 Como se ve en el ejemplo, la llamada $_POST['tipos'] devuelve un array, por lo que para procesarlo se utiliza un bucle 'for' que recorre todos los valores que contiene.