Formularios
A la hora de enviar un formulario, debemos tener claro cuando usar GET o POST.
GET: los parámetros se pasan en la URL.- <2048 caracteres, sólo ASCII.
- Permite almacenar la dirección completa (marcador / historial).
- Idempotente: dos llamadas con los mismos datos siempre debe dar el mismo resultado.
- El navegador puede cachear las llamadas.
POST: parámetros ocultos (no encriptados).- Sin límite de datos, permite datos binarios.
- No se pueden cachear.
- No idempotente → actualizar la base de datos.
Así pues, para recoger los datos accederemos al array dependiendo del método del formulario que nos ha invocado:
<?php
$par = $_GET["parametro"];
$par = $_POST["parametro"];
Para los siguientes apartados nos vamos a basar en el siguiente ejemplo:
<form action="formulario.php" method="GET">
<p><label for="nombre">Nombre del alumno:</label>
<input type="text" name="nombre" id="nombre" value="" />
</p>
<p><input type="checkbox" name="modulos[]" id="modulosDWES" value="DWES" />
<label for="modulosDWES">Desarrollo web en entorno servidor</label>
</p>
<p><input type="checkbox" name="modulos[]" id="modulosDWEC" value="DWEC" />
<label for="modulosDWEC">Desarrollo web en entorno cliente</label>
</p>
<input type="submit" value="Enviar" name="enviar" />
</form>
Parámetro multivalor
Existen elementos HTML que envían varios valores:
select multiplecheckbox
Para recoger los datos, el nombre del elemento debe ser un array.
<select name="lenguajes[]" multiple="true">
<option value="c">C</option>
<option value="java">Java</option>
<option value="php">PHP</option>
<option value="python">Python</option>
</select>
<input type="checkbox" name="lenguajes[]" value="c" /> C<br />
<input type="checkbox" name="lenguajes[]" value="java" /> Java<br />
<input type="checkbox" name="lenguajes[]" value="php" /> Php<br />
<input type="checkbox" name="lenguajes[]" value="python" /> Python<br />
De manera que luego al recoger los datos:
<?php
$lenguajes = $_GET["lenguajes"];
foreach ($lenguajes as $lenguaje) {
echo "$lenguaje <br />";
}
Volviendo a rellenar un formulario
Un sticky form es un formulario que recuerda sus valores. Para ello, hemos de rellenar los atributos value de los elementos HTML con la información que contenían:
<?php
if (!empty($_POST['modulos']) && !empty($_POST['nombre'])) {
// Aquí se incluye el código a ejecutar cuando los datos son correctos
} else {
// Generamos el formulario
$nombre = $_POST['nombre'] ?? "";
$modulos = $_POST['modulos'] ?? [];
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
<p>
<label for="nombre">Nombre del alumno:</label>
<input type="text" name="nombre" id="nombre" value="<?= $nombre ?>" />
</p>
<p>
<input type="checkbox" name="modulos[]" id="modulosDWES" value="DWES"
<?php if(in_array("DWES",$modulos)) echo 'checked="checked"'; ?> />
<label for="modulosDWES">Desarrollo web en entorno servidor</label>
</p>
<p>
<input type="checkbox" name="modulos[]" id="modulosDWEC" value="DWEC"
<?php if(in_array("DWEC",$modulos)) echo 'checked="checked"'; ?> />
<label for="modulosDWEC">Desarrollo web en entorno cliente</label>
</p>
<input type="submit" value="Enviar" name="enviar"/>
</form>
<?php } ?>
Subiendo archivos
Se almacenan en el servidor en el array $_FILES con el nombre del campo del tipo file del formulario.
<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Archivo: <input name="archivoEnviado" type="file" />
<br />
<input type="submit" name="btnSubir" value="Subir" />
</form>
Configuración en php.ini
file_uploads: on / offupload_max_filesize: 2Mupload_tmp_dir: directorio temporal. No es necesario configurarlo, cogerá el predeterminado del sistemapost_max_size: tamaño máximo de los datos POST. Debe ser mayor a upload_max_filesize.max_file_uploads: número máximo de archivos que se pueden cargar a la vez.max_input_time: tiempo máximo empleado en la carga (GET/POST y upload → normalmente se configura en 60)memory_limit: 128Mmax_execution_time: tiempo de ejecución de un script (no tiene en cuenta el upload)
Para cargar los archivos, accedemos al array $_FILES:
<?php
if (isset($_POST['btnSubir']) && $_POST['btnSubir'] == 'Subir') {
if (is_uploaded_file($_FILES['archivoEnviado']['tmp_name'])) {
// subido con éxito
$nombre = $_FILES['archivoEnviado']['name'];
move_uploaded_file($_FILES['archivoEnviado']['tmp_name'], "./uploads/{$nombre}");
echo "<p>Archivo $nombre subido con éxito</p>";
}
}
Cada archivo cargado en $_FILES tiene:
name: nombretmp_name: ruta temporalsize: tamaño en bytestype: tipo MIMEerror: si hay error, contiene un mensaje. Si ok → 0.