# Ejemplo de ejercicio 1 - Recogida y comprobación de datos

Algunos comentarios sobre la realización de ejercicios:

## Estructura general de los ejercicios

La mayoría de ejercicios propuestos como ejercicios básicos constan de dos páginas:

- una página html que incluye un formulario para introducir los datos
- una página php que procesa los datos y muestra la respuesta

### Página html

La página html enlaza a una hoja de estilo CSS (que es común a todos los ejercicios).

Tanto la página html como la hoja de estilo se pueden copiar de los ejemplos incluidos en los enunciados (dado que este es un curso de PHP, no un curso de HTML /CSS).

El formulario incluye controles cuyo nombre debe estar relacionado con la información que se va a escribir en ellos.

### Página php

La página php es el programa PHP que debe escribir el alumno.

En todos los primeros ejercicios propuestos en este curso, la página php siempre tiene que realizar las tareas:

- recoger los datos enviados por el formulario de la página html
- comprobar los datos y, si se detectan errores en ellos, indicarlo al usuario
- si todos los datos son correctos, mostrar el resutlado (para mostrar el resultado puede ser necesarios realizar cálculos o cpmrobar el resutlado de esos cálculos).

En el caso de ejercicios más complejos, los ejercicios pueden constar de una página html y varias páginas php o constar únicamente de páginas php.

Volver al principio de la página

## Ejemplo de ejercicio

En los enunciados de los ejercicios se incluye un ejemplo de ejercicio resuelto y un enlace al ejercicio resuelto, que se puede abrir en una pestaña (o ventana) diferente. Mostrando el código fuente de las páginas de los ejercicios, se puede ver el código HTML buscado. Ese código fuente se puede copiar y pegar en las páginas PHP.

A continuación se muestra un ejemplo de ejercicio y de enlace al ejercicio:

Enlace a ejemplo Recogida de datos 1

Volver al principio de la página

## Solución del ejemplo de ejercicio anterior

A continuación se comenta una posible solución para la página php del ejemplo anterior.

### Fragmentos HTML y fragmentos PHP

La página php del ejemplo contiene cuatro fragmentos:

- un fragmento PHP que contiene información sobre la autoría del programa y su licencia, de acuerdo con la guía de estilo de PEAR y que genera la declaración xml.
- un fragmento HTML con la cabecera de la página, que no depende de los datos introducidos por el usuario
- un fragmento PHP que recoge y procesa los datos
- un fragmento HTML con el pie de página, que tampoco depende de los datos introducidos por el usuario

A continuación se muestra el código fuente con los fragmentos PHP con fondo gris y los fragmentos HTML con fondo blanco:

    <?php
    /**
     * Ejemplo de recogida de datos 1 - ejemplo_recogida_datos_1.php
     *
     * @author    Bartolomé Sintes Marco <bartolome.sintes+mclibre@gmail.com>
     * @copyright 2011 Bartolomé Sintes Marco
     * @license   http://www.gnu.org/licenses/agpl.txt AGPL 3 or later
     * @version   2011-11-13
     * @link      http://www.mclibre.org
     */

    print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?".">\n";
    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      <title>Ejemplo de recogida de datos 2 (Resultado). Ejemplo de ejercicio.
      PHP. Bartolomé Sintes Marco</title>
      <link href="mclibre_php_soluciones.css" rel="stylesheet" type="text/css"
      title="Color" />
    </head>

    <body>
    <h1>Ejemplo de recogida de datos 2 (Resultado)</h1>

    <?php
    function recoge($var)
    {
        $tmp = (isset($_REQUEST[$var])) ? strip_tags(trim(htmlspecialchars($_REQUEST[$var]))) : '';
        if (get_magic_quotes_gpc()) {
            $tmp = stripslashes($tmp);
        }
        return $tmp;
    }

    $nombre = recoge('nombre');
    $edad   = recoge('edad');

    $nombreOk = FALSE;
    $edadOk   = FALSE;

    if ($nombre=="") {
        print "<p class=\"aviso\">No ha escrito su nombre.</p>\n";
    } else {
        $nombreOk = TRUE;
    }

    if ($edad=="") {
        print "<p class=\"aviso\">No ha escrito su edad.</p>\n";
    } elseif (!is_numeric($edad)) {
        print "<p  class=\"aviso\">No ha escrito la edad como número.</p>\n";
    } elseif (!ctype_digit($edad)) {
        print "<p class=\"aviso\">No ha escrito la edad como número entero.</p>\n";
    } elseif ($edad<0 || $edad>130) {
        print "<p class=\"aviso\">La edad no está entre 0 y 130 años.</p>\n";
    } else {
        $edadOk = TRUE;
    }

    if ($nombreOk && $edadOk) {
        print "<p>Su nombre es <strong>$nombre</strong>.</p>\n";
        print "<p>Su edad es <strong>$edad</strong>.</p>\n";
    }

    print "<p><a href=\"ejemplo_recogida_datos_1.html\">Volver al formulario.</a></p>\n";
    ?>

    <address>
      Este programa forma parte del curso "Páginas web con PHP" disponible en <a
      href="http://www.mclibre.org/">http://www.mclibre.org</a><br />
      Autor: Bartolomé Sintes Marco<br />
      Última modificación de esta página: 13 de noviembre de 2011
    </address>
    <p class="licencia">El programa PHP que genera esta página está bajo
    <a rel="license" href="http://www.gnu.org/licenses/agpl.txt">licencia AGPL 3 o
    posterior</a>.</p>
    </body>
    </html>

Por supuesto la página podría contener un único fragmento PHP en la que los fragmentos HTML fueran generados por instrucciones print.

Volver al principio de la página

### Núcleo del programa php

El fragmento PHP que recoge y genera los datos tiene la siguiente estructura:

- Recogida de datos:
  - primero se define la función recoge() comentada en la lección Recogida de datos.
  - después se guardan los dos datos del formulario en dos variables utilizando la función recoge(). El nombre de las variables coincide con el nombre de los controles (en este caso, $nombre y $edad)
- Comprobación de datos:
  - primero se definen unas variables lógicas auxiliares, cuyo nombre es el del control y la terminación Ok (en este caso, $nombreOk y $edadOk). El valor (TRUE o FALSE) representa si el dato escrito por el usuario es correcto o no. Estas variables se inicializan al valor FALSE (es decir, se empieza suponiendo que los datos escritos por el usuario son incorrectos).
  - después hay bloques if ... elseif ... else ... (uno por dato enviado por el usuario) en el que se comprueba si el dato escrito por el usuario presenta algún problema. Cada posible problema se evalúa en un condición. Si el dato no presenta ningún problema, la variable lógica auxiliar se modifica a TRUE (es decir, que si no presenta ningún problema, se supone que el dato es correcto).

    Dependiendo del tipo de dato, puede haber más o menos comprobaciones.

- Presentación de resultados:
  - primero hay un bloque if ... en el que se comprueba si todas las variables auxiliares son TRUE y se hace lo que se tenga que hacer. En este ejercicio simplemente se presentan el nombre y la edad escritos por el usuario, pero en otros ejercicios más complicados hay que hacer cálculos o mostrar mensajes distintos en función del resultado de esos cálculos.
  - después hay un párrafo con un enlace al formulario para volver a empezar.

A continuación se muestra el código fuente con los tres apartados con fondo gris y fondo blanco alternados:

    <?php

    function recoge($var)
    {
        $tmp = (isset($_REQUEST[$var])) ? strip_tags(trim(htmlspecialchars($_REQUEST[$var]))) : '';
        if (get_magic_quotes_gpc()) {
            $tmp = stripslashes($tmp);
        }
        return $tmp;
    }

    $nombre = recoge('nombre');
    $edad   = recoge('edad');

    $nombreOk = FALSE;
    $edadOk   = FALSE;

    if ($nombre=="") {
        print "<p class=\"aviso\">No ha escrito su nombre.</p>\n";
    } else {
        $nombreOk = TRUE;
    }

    if ($edad=="") {
        print "<p class=\"aviso\">No ha escrito su edad.</p>\n";
    } elseif (!is_numeric($edad)) {
        print "<p  class=\"aviso\">No ha escrito la edad como número.</p>\n";
    } elseif (!ctype_digit($edad)) {
        print "<p class=\"aviso\">No ha escrito la edad como número entero.</p>\n";
    } elseif ($edad<0 || $edad>130) {
        print "<p class=\"aviso\">La edad no está entre 0 y 130 años.</p>\n";
    } else {
        $edadOk = TRUE;
    }

    if ($nombreOk && $edadOk) {
        print "<p>Su nombre es <strong>$nombre</strong>.</p>\n";
        print "<p>Su edad es <strong>$edad</strong> años.</p>\n";
    }

    print "<p><a href=\"ejemplo_recogida_datos_1.html\">Volver al formulario.</a></p>\n";

    ?>

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons Reconocimiento-CompartirIgual 3.0 España.