Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. Introduccin
Un formulario sencillo con dos campos a rellenar y un botn para enviar en HTML es de la
siguiente forma:
<html>
<body>
</form>
</body>
</html>
Cuando un usuario rellena los datos y hace click en enviar, los datos del formulario se envan para
ser procesados al archivo formpost.php. Los datos se envan a travs de HTTP con el mtodo HTTP
Post.
Una vez los datos estn en formpost.php pueden mostrarse, guardarse en una base de datos o lo
que se necesite. En formpost.php vamos a mostrarlos con echo:
<html>
<body>
</body>
</html>
<html>
<body>
</form>
</body>
</html>
<html>
<body>
</body>
</html>
Estos han sido dos ejemplos muy sencillos para ver el funcionamiento bsico de un formulario.
Siempre que se crean formularios hay que tener muy en cuenta la seguridad, y para ello se utiliza
la validacin de formularios.
Las superglobals $_GET y $_POST sirven para coleccionar datos de formularios, y vamos a ver las
diferencias a continuacin.
2. GET y POST
$_GET y $_POST son variables superglobales que forman arrays de keys y values, donde los keys
son los nombres del formulario (atributo "name") y los values son los datos de entrada de los
usuarios. El hecho de que sean superglobals hace que sean accesibles desde el script
independientemente del mbito.
$_GET es un array de variables que se pasan al script a travs de los parmetros de URL. La
informacin que se enva es visible para todo el mundo y tiene limitada la cantidad de informacin
que se puede enviar a 2000 caracteres. Las URLs con los datos enviados pueden guardarse en
marcadores, lo que puede ser til en ciertos casos. $_GET slo se emplea para el envo de
informacin reducida y no sensible.
$_POST es un array de variables que se pasan al script a travs del mtodo HTTP POST. La
informacin que se enva no es visible para los dems ya que los nombres y variables van
embebidas en el body del HTTP request. No tiene lmites en la cantidad de informacin a enviar.
Soporta datos de entrada multi-part binary a la hora se subir archivos al servidor (lo que permite
subir mltiples archivos a la vez).
3. Tipos de elementos
Los 10 tipos de elementos ms importantes para los formularios HTML con PHP son:
Elemento Descripcin
input type="password" Caja de texto donde se muestran asteriscos en lugar de los caracteres
escritos
input type="radio" Cajas seleccionables en grupos que slo permiten escoger una opcin
4. Validacin
El siguiente es un sencillo formulario algo ms complejo con los siguiente datos: Nombre,
Contrasea, Educacion, Nacionalidad, Idiomas, Email y Sitio web:
<h2>Formulario:</h2>
Nombre:
Contrasea:
Educacion:
<select name="educacion">
<option value="universidad">Universidad</option>
</select> <br>
Nacionalidad:
Idiomas:
Email:
Sitio Web:
// Botn de enviar
</form>
</body>
</html>
Contrasea es del tipo password, lo que permite ocultar los caracteres con * cuando se escribe.
Educacin es un elemento select, que permite seleccionar options en una lista. El texto en el
atributo value es el que se enviar a travs del formulario. El atributo selected permite mostrar el
seleccionado por defecto.
Nacionalidad es del tipo radio, los elementos radio del mismo grupo han de tener un nico
atributo name y slo se puede seleccionar uno.
Los idiomas estn en un elemento checkbox, que permite enviar varios datos en forma de array si
se indica en el atributo name con corchetes. Se puede aadir un atributo checked como
seleccionado por defecto.
En este ejemplo todas las acciones de validar, enviar y recibir datos se hacen en el mismo archivo
form.php.
Primero vamos a crear un filtrado comn para todos los campos con la funcin filtrado():
function filtrado($datos){
return $datos;
$nombre = filtrado($_POST["nombre"]);
$password = filtrado($_POST["password"]);
$educacion = filtrado($_POST["educacion"]);
$nacionalidad = filtrado($_POST["nacionalidad"]);
$email = filtrado($_POST["email"]);
$sitioweb = filtrado($_POST["sitioweb"]);
Para aceptar los datos se ha puesto _isset($POST["submit"]), que crea la key submit cuando se
hace click en el botn, y _$_SERVER["REQUESTMETHOD"] == "post", que especifica que el mtodo
request ha de ser POST. Se puede usar una de las dos formas o las dos a la vez.
Todos los campos anteriores son opcionales. La validacin ms bsica consiste en exigir que se
rellene un campo, y comprobaremos tambin que el email tiene un formato de email, que el sitio
web es una URL correcta y que password tiene un mnimo de 5 caracteres. Las validaciones de
formatos pueden realizarse mediante expresiones regulares o con filtros. Siempre que sea posible,
es mejor utilizar los filtros de PHP.
if(empty($_POST["nombre"])){
if(empty($errores)) {
$nombre = filtrado($_POST["nombre"]);
$password = filtrado($_POST["password"]);
$educacion = filtrado($_POST["educacion"]);
$nacionalidad = filtrado($_POST["nacionalidad"]);
$email = filtrado($_POST["email"]);
$sitioweb = filtrado($_POST["sitioweb"]);
El array de errores $errores guarda cada uno de los errores que se registran para luego mostrarlos.
Si el array tiene algn elemento, el formulario no ser aceptado. Para mostrarlos podemos hacerlo
as:
<ul>
<?php if(isset($errores)){
?>
</ul>
5. Subida de archivos
Es necesario que los permisos tanto del directorio temporal como del directorio final sean de
escritura.
<html>
<body>
</form>
</body>
</html>
Se incluye un input del tipo hidden que limita el tamao mximo del archivo que se puede subir
(en bytes).
$directorioSubida = "uploads/";
$max_file_size = "51200";
$errores = array();
$nombreArchivo = $_FILES['imagen']['name'];
$filesize = $_FILES['imagen']['size'];
$directorioTemp = $_FILES['imagen']['tmp_name'];
$tipoArchivo = $_FILES['imagen']['type'];
$arrayArchivo = pathinfo($nombreArchivo);
$extension = $arrayArchivo['extension'];
if(!in_array($extension, $extensionesValidas)){
$nombreArchivo = $arrayArchivo['filename'];
if(empty($errores)){
$nombreCompleto = $directorioSubida.$nombreArchivo.".".$extension;
move_uploaded_file($directorioTemp, $nombreCompleto);
Una subida mltiple de archivos en PHP en la prctica se hace normalmente con ayuda de
JavaScript. Una buena librera para subir archivos es DropzoneJS.
En el formulario HTML lo nico que cambia es que se aade un atributo multiple y que en el
atributo name del input file se aade corchetes para indicar que es un array:
En cuanto al backend, omitiendo validaciones esta puede ser una forma de hacerlo:
$directorioSubida = "uploads/";
$max_file_size = "51200";
$nombres = $_FILES['imagenes']['name'];
$temporales = $_FILES['imagenes']['tmp_name'];
$tipos = $_FILES['imagenes']['type'];
$errores = $_FILES['imagenes']['error'];
if(move_uploaded_file($temporales[$i], $directorioSubida.$nombres[$i])){
} else {