Desarrollo de aplicaciones web con PHP y MySQL
Tratamiento de formularios en PHP
Sergio Sáez y José Luis Poza
E.T.S. de Ingeniería Informática
Comprobando valores
- Existen un conjunto de funciones de filtrado y validación que permiten procesar los campos de entrada de un formulario.
- La función filter_input permite filtrar los valores de los vectores $_GET, $_POST, $_COOKIE, etc.
- Si el valor no cumple el filtro se devuelve false.
- Si el valor no está definido se devuelve null.
<?php
$n_ruedas= filter_input(INPUT_GET, "numruedas", FILTER_VALIDATE_INT);
if ($n_ruedas === false) {
echo "El valor de las ruedas no se ha establecido correctamente";
} // endif
$total= $n_ruedas * PRECIORUEDAS;
?>
- Existen filtros para boolean, int, float, e-mail, URLs, direcciones IP, expresiones regulares, etc.
Valores por omisión
- Los campos tienen un valor por omisión que aparecerá en el campo de entrada.
- Útil cuando se van a modificar datos que ya han sido introducidos en la aplicación. En ese caso se rellena los campos del formulario con los valores antiguos.
Valores por omisión (cont.)
<form action="peticion-01.php" method="post">
<table>
<tr>
<td>Primero: </td>
<td><input type="text" name="uno"
size="20" value="Valor de uno"></td>
</tr>
<tr>
<td>Segundo: </td>
<td><input type="text" name="dos"
size="20" value="Valor de dos"></td>
</tr>
<tr>
<td>Tercero: </td>
<td><input type="text" name="tres"
size="20" value="Valor de tres"></td>
</tr>
<tr>
<td>Cuarto: </td>
<td><input type="text" name="cuatro"
size="20" value="Valor de cuatro"></td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Valores por omisión (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
foreach ($elementos as $clave => $valor) {
if (trim($_POST[$clave]) != "")
$pedido[$clave]= trim($_POST[$clave]);
else {
echo "$valor no se ha establecido<br>";
} // endif
} // end foreach
if (count($pedido) != count($elementos)) {
echo "<p>Faltan parámetros</p>\n";
echo "<a href=\"javascript:history.go(-1)\">Volver</a>\n";
exit;
} // endif
echo "<table>";
foreach ($pedido as $clave => $valor) {
echo "<tr>\n\t<td><b>". $elementos[$clave];
echo ":</b></td>\n\t<td> $valor </td>\n</tr>";
} // end foreach
echo "</table>";
?>
Valores por omisión (cont.)
_POST:
Array
(
[uno] => Valor de uno
[dos] => Valor de dos
[tres] => Valor de tres
[cuatro] => Valor de cuatro
)
| Primero: |
Valor de uno |
| Segundo: |
Valor de dos |
| Tercero: |
Valor de tres |
| Cuarto: |
Valor de cuatro |
Valores por omisión (cont.)
<pre>
_POST:<br>Array
(
[uno] => Valor de uno
[dos] => Valor de dos
[tres] => Valor de tres
[cuatro] => Valor de cuatro
)
</pre>
<table><tr>
<td><b>Primero:</b></td>
<td> Valor de uno </td>
</tr><tr>
<td><b>Segundo:</b></td>
<td> Valor de dos </td>
</tr><tr>
<td><b>Tercero:</b></td>
<td> Valor de tres </td>
</tr><tr>
<td><b>Cuarto:</b></td>
<td> Valor de cuatro </td>
</tr></table>
Vectores en los campos de entrada
- Los campos de entrada tienen como identificador el elemento de un vector.
- El interprete de PHP convierte los campos de entrada con formato de vector en un vector dentro de $_GET y $_POST.
Vectores en los campos de entrada (cont.)
<form action="peticion-02.php" method="post">
<table>
<tr>
<td>Primero: </td>
<td><input type="text" name="vector[uno]"
size="20"></td>
</tr>
<tr>
<td>Segundo: </td>
<td><input type="text" name="vector[dos]"
size="20"></td>
</tr>
<tr>
<td>Tercero: </td>
<td><input type="text" name="vector[tres]"
size="20"></td>
</tr>
<tr>
<td>Cuarto: </td>
<td><input type="text" name="vector[cuatro]"
size="20"></td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Vectores en los campos de entrada (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
$vector= $_POST["vector"];
foreach ($vector as $clave => $valor) {
if (trim($vector[$clave]) != "")
$pedido[$clave]= trim($vector[$clave]);
else {
echo $elementos[$clave]. " no se ha establecido<br>\n";
} // endif
} // end foreach
if (count($pedido) != count($elementos)) {
echo "<p>Faltan parámetros</p>\n";
echo "<a href=\"javascript:history.go(-1)\">Volver</a>\n";
exit;
} // endif
echo "<table>";
foreach ($pedido as $clave => $valor) {
echo "<tr>\n\t<td><b>". $elementos[$clave]. ":</b></td>\n\t<td> $valor </td>\n</tr>";
} // end foreach
echo "</table>";
?>
Vectores en los campos de entrada (cont.)
<pre>
_POST:<br>Array
(
[cesta] => Array
(
[uno] =>
[dos] => un dos
[tres] =>
[cuatro] => un cuatro
)
)
</pre>
Primero no se ha establecido<br>
Tercero no se ha establecido<br>
<p>Faltan parámetros</p>
<a href="javascript:history.go(-1)">Volver</a>
Vectores en los campos de entrada (cont.)
_POST:
Array
(
[cesta] => Array
(
[uno] =>
[dos] => un dos
[tres] =>
[cuatro] => un cuatro
)
)
Primero no se ha establecido
Tercero no se ha establecido
Faltan parámetros
Volver
Checkboxes
- Al contrario que los campos de entrada de texto, con los checkboxes sólo estarán definidos aquellos campos que hayan sido marcados.
Checkboxes (cont.)
<form action="peticion-03.php" method="post">
<table>
<tr>
<td><input type="checkbox" name="uno"></td>
<td>Primero</td>
</tr>
<tr>
<td><input type="checkbox" name="dos"></td>
<td>Segundo</td>
</tr>
<tr>
<td><input type="checkbox" name="tres"></td>
<td>Tercero</td>
</tr>
<tr>
<td><input type="checkbox" name="cuatro"></td>
<td>Cuarto</td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Checkboxes (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
foreach ($elementos as $clave => $valor) {
if (isset($_POST[$clave])) {
echo $elementos[$clave]. " se ha marcado<br>\n";
} else {
echo $elementos[$clave]. " <b>no</b> se ha marcado<br>\n";
} // endif
} // end foreach
?>
Checkboxes (cont.)
<pre>
_POST:<br>Array
(
[dos] => on
[cuatro] => on
)
</pre>
Primero <b>no</b> se ha marcado<br>
Segundo se ha marcado<br>
Tercero <b>no</b> se ha marcado<br>
Cuarto se ha marcado<br>
Checkboxes (cont.)
_POST:
Array
(
[dos] => on
[cuatro] => on
)
Primero
no se ha marcado
Segundo se ha marcado
Tercero
no se ha marcado
Cuarto se ha marcado
Checkboxes con valores
- El valor de los checkboxes que estén marcados será el indicado por el atributo value del campo input.
Checkboxes con valores (cont.)
<form action="peticion-03b.php" method="post">
<table>
<tr>
<td><input type="checkbox" name="uno" value="Primero"></td>
<td>Primero</td>
</tr>
<tr>
<td><input type="checkbox" name="dos" value="Segundo"></td>
<td>Segundo</td>
</tr>
<tr>
<td><input type="checkbox" name="tres" value="Tercero"></td>
<td>Tercero</td>
</tr>
<tr>
<td><input type="checkbox" name="cuatro" value="Cuarto"></td>
<td>Cuarto</td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Checkboxes con valores (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
foreach ($elementos as $clave => $valor) {
if (isset($_POST[$clave])) {
echo $_POST[$clave]. " se ha marcado<br>\n";
} else {
echo $elementos[$clave]. " <b>no</b> se ha marcado<br>\n";
} // endif
} // end foreach
?>
Checkboxes con valores (cont.)
<pre>
_POST:<br>Array
(
[dos] => Segundo
[cuatro] => Cuarto
)
</pre>
Primero <b>no</b> se ha marcado<br>
Segundo se ha marcado<br>
Tercero <b>no</b> se ha marcado<br>
Cuarto se ha marcado<br>
Checkboxes con vectores
- Los campos de tipo checkbox con formato de vector facilitan la comprobación de la presencia o ausencia de una opción marcada si el número de posibilidades es elevado.
Checkboxes con vectores (cont.)
<form action="peticion-04.php" method="post">
<table>
<tr>
<td><input type="checkbox" name="vector[uno]"></td>
<td>Primero</td>
</tr>
<tr>
<td><input type="checkbox" name="vector[dos]"></td>
<td>Segundo</td>
</tr>
<tr>
<td><input type="checkbox" name="vector[tres]"></td>
<td>Tercero</td>
</tr>
<tr>
<td><input type="checkbox" name="vector[cuatro]"></td>
<td>Cuarto</td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Checkboxes con vectores (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
$vector= $_POST["vector"];
echo "Las opciones marcadas son: <br>";
echo "<ul>\n";
foreach ($vector as $clave => $valor) {
echo "<li>". $elementos[$clave] ."</li>\n";
} // end foreach
echo "</ul>\n";
?>
Checkboxes con vectores (cont.)
<pre>
_POST:<br>Array
(
[cesta] => Array
(
[dos] => on
[cuatro] => on
)
)
</pre>
Las opciones marcadas son: <br><ul>
<li>Segundo</li>
<li>Cuarto</li>
</ul>
Checkboxes con vectores (cont.)
_POST:
Array
(
[cesta] => Array
(
[dos] => on
[cuatro] => on
)
)
Las opciones marcadas son:
radio buttons
- Son fáciles de manejar, ya que sólo se generará una variable por cada conjunto de radio buttons.
radio buttons (cont.)
<form action="peticion-05.php" method="post">
<table>
<tr>
<td><input type="radio" name="seleccionado"
value="uno"></td>
<td>Primero</td>
</tr>
<tr>
<td><input type="radio" name="seleccionado"
value="dos"></td>
<td>Segundo</td>
</tr>
<tr>
<td><input type="radio" name="seleccionado"
value="tres"></td>
<td>Tercero</td>
</tr>
<tr>
<td><input type="radio" name="seleccionado"
value="cuatro"></td>
<td>Cuarto</td>
</tr>
</table>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
radio buttons (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
if (isset($_POST["seleccionado"]))
echo "La opción seleccionada ha sido: " . $elementos[$_POST["seleccionado"]];
else
echo "No se ha seleccionado ninguna";
?>
radio buttons (cont.)
<pre>
_POST:<br>Array
(
[seleccionado] => tres
)
</pre>
La opción seleccionada ha sido: Tercero
radio buttons (cont.)
_POST:
Array
(
[seleccionado] => tres
)
La opción seleccionada ha sido: Tercero
Ventanas de selección (cont.)
<form action="peticion-06.php" method="post">
<table>
<select name="seleccionado">
<option value="none" selected>Selecciona un valor</option>
<option value="uno">Primero</option>
<option value="dos">Segundo</option>
<option value="tres">Tercero</option>
<option value="cuatro">Cuarto</option>
</select>
</table>
<br>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Ventanas de selección (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
if ($_POST["seleccionado"] != "none")
echo "La opción seleccionada ha sido: " . $elementos[$_POST["seleccionado"]];
else
echo "No se ha seleccionado ninguna";
echo "</ul>\n";
?>
Ventanas de selección (cont.)
<pre>
_POST:<br>Array
(
[seleccionado] => dos
)
</pre>
La opción seleccionada ha sido: Segundo</ul>
Ventanas de selección (cont.)
_POST:
Array
(
[seleccionado] => dos
)
La opción seleccionada ha sido: Segundo
Ventanas de selección múltiple
- Los campos de selección múltiple sólo los elementos seleccionados, pero no el orden de la selección
Ventanas de selección múltiple (cont.)
<form action="peticion-07.php" method="post">
<table>
<select name="vector[]" multiple>
<option value="uno">Primero</option>
<option value="dos">Segundo</option>
<option value="tres">Tercero</option>
<option value="cuatro">Cuarto</option>
</select>
</table>
<br>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Ventanas de selección múltiple (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
$vector= $_POST["vector"];
echo "Las opciones marcadas son: <br>";
echo "<ul>\n";
foreach ($vector as $clave => $valor) {
echo "<li>$clave: $valor ($elementos[$valor])</li>\n";
} // end foreach
echo "</ul>\n";
?>
Ventanas de selección múltiple (cont.)
<pre>
_POST:<br>Array
(
[cesta] => Array
(
[0] => dos
[1] => cuatro
)
)
</pre>
Las opciones marcadas son: <br><ul>
<li>0: dos (Segundo)</li>
<li>1: cuatro (Cuarto)</li>
</ul>
Ventanas de selección múltiple (cont.)
_POST:
Array
(
[cesta] => Array
(
[0] => dos
[1] => cuatro
)
)
Las opciones marcadas son:
- 0: dos (Segundo)
- 1: cuatro (Cuarto)
Campos ocultos
- Permiten enviar información oculta asociada al formulario.
Campos ocultos (cont.)
<form action="peticion-08.php" method="post">
<table>
<tr>
<td>Primero: </td>
<td><input type="text" name="uno" size="20"
value="Valor por omisión"></td>
</tr>
<tr>
<td>Segundo: </td>
<td><input type="text" name="dos" size="20"
value="Valor por omisión"></td>
</tr>
<tr>
<td>Tercero: </td>
<td><input type="text" name="tres" size="20"
value="Valor por omisión"></td>
</tr>
<tr>
<td>Cuarto: </td>
<td><input type="text" name="cuatro" size="20"
value="Valor por omisión"></td>
</tr>
</table>
Valor oculto: <b>Oculto: </b>Hola a todos!<br>
<input type="hidden" name="Oculto" value="Hola a todos!">
<br>
<input type="submit" value="Enviar">
<input type="reset" value="Borrar">
</form>
Campos ocultos (cont.)
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
foreach ($elementos as $clave => $valor) {
if (trim($_POST[$clave]) != "")
$pedido[$clave]= trim($_POST[$clave]);
else {
echo "$valor no se ha establecido<br>";
} // endif
} // end foreach
if (count($pedido) != count($elementos)) {
echo "<p>Faltan parámetros</p>";
echo "<a href=\"javascript:history.go(-1)\">Volver</a>";
exit;
} // endif
echo "<table>";
foreach ($pedido as $clave => $valor) {
echo "<tr>\n\t<td><b>". $elementos[$clave]. ":</b></td>\n\t<td> $valor </td>\n</tr>";
} // end foreach
echo "<tr>\n\t<td><b>El valor oculto:</b></td>\n\t<td> $_POST[Oculto] </td>\n</tr>";
echo "</table>";
?>
Campos ocultos (cont.)
<pre>
_POST:<br>Array
(
[uno] => Valor por omisión
[dos] => Valor por omisión
[tres] => Valor por omisión
[cuatro] => Valor por omisión
[Oculto] => Hola a todos!
)
</pre>
<table><tr>
<td><b>Primero:</b></td>
<td> Valor por omisión </td>
</tr><tr>
<td><b>Segundo:</b></td>
<td> Valor por omisión </td>
</tr><tr>
<td><b>Tercero:</b></td>
<td> Valor por omisión </td>
</tr><tr>
<td><b>Cuarto:</b></td>
<td> Valor por omisión </td>
</tr><tr>
<td><b>El valor oculto:</b></td>
<td> Hola a todos! </td>
</tr>
</table>
Campos ocultos (cont.)
_POST:
Array
(
[uno] => Valor por omisión
[dos] => Valor por omisión
[tres] => Valor por omisión
[cuatro] => Valor por omisión
[Oculto] => Hola a todos!
)
| Primero: |
Valor por omisión |
| Segundo: |
Valor por omisión |
| Tercero: |
Valor por omisión |
| Cuarto: |
Valor por omisión |
| El valor oculto: |
Hola a todos! |
Enlaces con información
Formulario de texto
| Este enlace envia el valor uno=> Primero |
ENLACE |
| Este enlace envia el valor dos=> Segundo |
ENLACE |
| Este enlace envia el valor tres=> Tercero |
ENLACE |
| Este enlace envia el valor cuatro=> Cuarto |
ENLACE |
- Permiten asociar parámetros de tipo get a un enlace convencional.
- Muy utilizado al mostrar resultados de una búsqueda.
Enlaces con información (cont.)
<h1>Formulario de texto</h1>
<table>
<tr>
<td>Este enlace envia el valor uno=> Primero</td>
<td><a href="peticion-09.php?uno=El+valor+es+Primero">ENLACE</a></td>
</tr>
<tr>
<td>Este enlace envia el valor dos=> Segundo</td>
<td><a href="peticion-09.php?dos=El+valor+es+Segundo">ENLACE</a></td>
</tr>
<tr>
<td>Este enlace envia el valor tres=> Tercero</td>
<td><a href="peticion-09.php?tres=El+valor+es+Tercero">ENLACE</a></td>
</tr>
<tr>
<td>Este enlace envia el valor cuatro=> Cuarto</td>
<td><a href="peticion-09.php?cuatro=El+valor+es+Cuarto">ENLACE</a></td>
</tr>
</table>
Enlaces con información (cont.)
<h1>Formulario de texto</h1>
<table>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
foreach ($elementos as $clave => $valor) {
?>
<tr>
<td>Este enlace envia el valor <?= $clave ?>=> <?= $valor ?></td>
<td><a href="peticion-09.php?<?= $clave ?>=<?= urlencode("El valor es $valor") ?>">ENLACE</a></td>
</tr>
<?php
} // Fin de foreach
?>
</table>
Enlaces con información (cont.)
<pre>
_GET:<br>Array
(
[cuatro] => El valor es Cuarto
)
</pre>
<table>
<tr>
<td><b>cuatro:</b></td>
<td> El valor es Cuarto </td>
</tr>
</table>
Enlaces con información (cont.)
_GET:
Array
(
[cuatro] => El valor es Cuarto
)
| cuatro: |
El valor es Cuarto |
Botones con información
- Permiten asociar información que se transmitirá al pulsar el botón.
- Se sugiere utilizar la notación de vector en el identificador del botón para facilitar la captura de los datos.
Botones con información (cont.)
<h1>Formulario de texto</h1>
<form action="peticion-12.php" method="post">
<table>
<tr>
<td>Elemento: Primero</td>
<td><input type="submit" name="accion[borrar:uno]" value="Borrar"></td>
</tr>
<tr>
<td>Elemento: Segundo</td>
<td><input type="submit" name="accion[borrar:dos]" value="Borrar"></td>
</tr>
<tr>
<td>Elemento: Tercero</td>
<td><input type="submit" name="accion[borrar:tres]" value="Borrar"></td>
</tr>
<tr>
<td>Elemento: Cuarto</td>
<td><input type="submit" name="accion[borrar:cuatro]" value="Borrar"></td>
</tr>
</table>
<input type="submit" name="accion[comprar]" value="Comprar">
<input type="submit" name="accion[cancelar]" value="Cancelar">
</form>
Botones con información (cont.)
<h1>Formulario con varios botones de envÃo</h1>
<pre>
<?= "_POST:<br>";
print_r($_POST);
?>
</pre>
<?php
$elementos= array("uno" => "Primero",
"dos" => "Segundo",
"tres" => "Tercero",
"cuatro" => "Cuarto");
if (isset($_POST["accion"])) {
$orden= key($_POST['accion']);
$accion= explode(":", $orden, 2);
} else {
echo "No se ha especificado ninguna acción";
} // endif
echo "Se ha solicitado '$accion[0]'<br>\n";
if (count($accion) > 1) {
echo "Parámetros de $accion[0]: $accion[1]<br>\n";
} // endif
?>
Botones con información (cont.)
<pre>
_POST:<br>Array
(
[accion] => Array
(
[borrar:tres] => Borrar
)
)
</pre>
Se ha solicitado 'borrar'<br>
Parámetros de borrar: tres<br>
Botones con información (cont.)
_POST:
Array
(
[accion] => Array
(
[borrar:tres] => Borrar
)
)
Se ha solicitado 'borrar'
Parámetros de borrar: tres