En este capítulo veremos como generar una interacción entre los usuarios que visiten nuestro sitio web y nuestro servidor, es decir, que los usuarios puedan enviar información a nuestro servidor, y desde nuestro servidor procesar dicha información. Por ejm, que un usuario quiera autenticarse, lo que tiene que hacer es enviar su correo y contraseña y desde nuestro servidor se comprobará que sean correctas, de ser así iniciamos sesión, caso contrario lo rechazamos.
Mediante los formularios se puede enviar dicha información. Para entender lo que son los formularios vamos a crear una sintaxis con todos los tipos de campos (inputs) que se pueden crear.
Métodos de envío de formularios
Existen 2 métodos para el envío de formulario:
- Método GET: si utilizamos este método, todos los campos de este formulario se enviarán en el header del objeto HTTP Request, y al enviarse en el header vamos a poder visualizar toda la información que estamos enviando en el formulario desde la URL.
- Método POST: toda la información viajará de manera oculta a través del body del objeto HTTP Request, el método POST se utilizará cuando estemos enviando información de manera sensible.
Variables globales
Siempre que enviamos información vía formulario, dicha información se queda almacenada en unas variables globales que tiene PHP. Existen varios tipos de estas variables globales.
- $_GET: almacena la información de formulario enviada vía GET
- $_POST: almacena la información de formulario enviada vía POST
- $_REQUEST: almacena la información tanto de los formularios GET como POST
Envío de archivos
Cuando queramos enviar archivos a nuestro servidor no podemos utilizar el método GET, debemos utilizar necesariamente el método POST. Además hay que habilitar el envío de archivos, para lo cual, a la etiqueta <form> le tenemos que agregar el atributo enctype="multipart/form-data". De esta manera habilitamos el envío de archivos desde un formulario, si no lo hacemos no podremos enviar archivos al servidor.
Para recibir el archivo ya no utilizaremos las variables globales anteriormente utilizadas ($_POST o $_REQUEST), utilizaremos la variable global $_FILES['image'], siendo image la llave que utilizaremos para recuperar los datos del archivos que hemos enviado.
Estructura select
La etiqueta <select></select> viene acompañada de la etiqueta <option></option>. Los select funcionan de una manera similar a los inputs de tipo radio, sólo que permite tener estos elementos en forma de lista.
Estructura textarea
La etiqueta <textarea> permite colocar una especie de input pero más grande, se utiliza si necesitamos mandar un texto más largo.
Ejemplo
Os dejamos un ejemplo completo con dos páginas, una que envía los datos mediante un formulario y la otra que los recibe.
formulario.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="21-formularios2.php" method="POST" enctype="multipart/form-data">
<!-- Input type text -->
<!-- Primera manera del uso de la etiqueta <label> junto con <input>, para ello en el input
ponemos un atributo id que tiene que tener el mismo valor que el valor utilizado en el atributo
for de la etiqueta label, en nuestro caso el atributo es 'nombre' -->
<!-- <label for="nombre">Nombre</label>
<input type="text" id="nombre"> -->
<!-- Segunda manera del uso de la etiqueta <label> junto con <input>, todo dentro
de las etiquetas <label> </label> Será el que usaremos para el ejercicio -->
<label>
Nombre:
<input type="text" name="nombre" autofocus="autofocus">
</label>
<br>
<label>
Edad:
<input type="number" name="edad">
</label>
<br>
<!-- Inputs de tipo radio para sólo poder elegir una opción -->
<!-- El atributo name tiene que llevar el mismo nombre -->
<p>Sexo: </p>
<label>
<input type="radio" name="sexo" value="masculino">
Masculino
</label>
<label>
<input type="radio" name="sexo" value="femenino">
Femenino
</label>
<br>
<!-- Envío de más de 1 información en un mismo campo mediante un input tipo checkbox -->
<p>Roles: </p>
<label>
<input type="checkbox" name="roles[]" value="administrador">
Administrador
</label>
<label>
<input type="checkbox" name="roles[]" value="editor">
Editor
</label>
<label>
<input type="checkbox" name="roles[]" value="moderador">
Moderador
</label>
<br><br>
<!-- Envío de archivos -->
<label>
Imagen:
<input type="file" name="image">
</label>
<br>
<!-- Uso de la etiqueta <select>, similar a el input de tipo radio pero mostrando una lista -->
<p>Oficio:</p>
<select name="oficio">
<option value="mecanico">Mecánico</option>
<option value="carpintero" selected>Carpintero</option>
</select>
<br><br>
<!-- Uso de la etiqueta <textarea> -->
<label>
Mensaje: <br>
<textarea name="mensaje" cols="100" rows="10">Escribe tu texto</textarea>
</label>
<br><br>
<!-- Enviar todos los campos del formulario al archivo incluido en el atributo action de
la etiqueta <form> -->
<button type="submit">Enviar</button>
</form>
</body>
</html>
formulario-recepcion.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
$nombre = $_REQUEST['nombre'];
echo "El nombre del usuario es: <b> $nombre</b>";
echo "<br />";
$edad = $_REQUEST['edad'];
echo "La edad del usuario es: <b> $edad</b>";
echo "<br />";
$sexo = $_REQUEST['sexo'];
echo "El sexo del usuario es: <b> $sexo</b>";
$roles = $_REQUEST['roles'];
echo "<p>Roles: </p>";
echo "<ul>";
foreach ($roles as $rol) {
echo "<li>$rol</li>";
}
echo "</ul>";
$image = $_FILES['image'];
// var_dump($image)
// Creo una variable que muestra la ruta de nuestro servidor
$patch = $_SERVER['DOCUMENT_ROOT'] . "/2025/php8-mysql8-curso/imagenes/" . $image['name'];
// echo "La ruta donde se almacena la imagen es: $patch";
// echo "<br /><br />";
// Vamos a mover la imagen de la carpeta temporal a la carpeta que está en la ruta $path
// Lo haremos mediante la función move_uploaded_file(donde se encuentra actualmente la imagen, ruta de destino)
move_uploaded_file($image['tmp_name'], $patch);
$oficio = $_REQUEST['oficio'];
echo "El oficio del usuario es: <b> $oficio</b><br />";
$mensaje = $_REQUEST['mensaje'];
echo "Mensaje enviado: $mensaje";
?>
</form>
</body>
</html>