Saltar al contenido principal

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 multiple
  • checkbox

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 / off
  • upload_max_filesize: 2M
  • upload_tmp_dir: directorio temporal. No es necesario configurarlo, cogerá el predeterminado del sistema
  • post_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: 128M
  • max_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: nombre
  • tmp_name: ruta temporal
  • size: tamaño en bytes
  • type: tipo MIME
  • error: si hay error, contiene un mensaje. Si ok → 0.