# Ejercicios - Bases de datos 1

El objetivo final es obtener una aplicación web capaz de gestionar una agenda. El título del ejercicio hace referencia a la funcionalidad añadida a la aplicación:

Estos ejercicios van encadenados. Cada ejercicio se puede hacer a partir del ejercicio anterior, añadiendo las páginas necesarias.

En estos ejercicios no se hace ninguna comprobación sobre los datos introducidos por el usuario, por lo que la aplicación no puede considerarse segura.

## Bases de datos 1 - Borrar y crear la base de datos

Escriba un programa que permita crear una base de datos.

- La página principal incluye un menú con un enlace a la página de borrado y creación de la tabla.
- El borrado y creación de tabla se hace en dos páginas, que incluyen un menú con un enlace a la página inicial.
  - La primera página contiene un formulario que pide confirmación. Si se contesta "No", se vuelve a la página inicial. Si se contesta "Sí", se llega a la segunda página.
  - La segunda página borra y crea la base de datos, que contiene una tabla con dos campos.

Enlace a ejercicio Base de datos 1-1

### Comentarios

- En una aplicación real, el borrado y creación de la base de datos estarían disponibles únicamente para el administrador, pero aquí cualquier usuario puede borrar y crear la base de datos.
- El proceso de borrar y crear la base de datos se realiza uno tras otro. Lógicamente, la primera vez que se realice el borrado y creación de la base de datos se obtendrá un mensaje de error en el borrado puesto que la base de datos no existe todavía, pero las veces siguientes no.
- Si el usuario intenta acceder directamente a la página que crea la tabla (escribiendo la dirección en el navegador), se le redireccionará directamente a la página inicial.
- Esta pueden ser las consultas de creación de tabla para este proyecto:

      // Tamaño de los campos en la tabla
      $tamNombre    = 40; // Tamaño del campo Nombre
      $tamApellidos = 60; // Tamaño del campo Apellidos

      // Consulta de creación de tabla en MySQL
      $consulta = "CREATE TABLE $dbTabla (
          id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          nombre VARCHAR($tamNombre),
          apellidos VARCHAR($tamApellidos),
          PRIMARY KEY(id)
          )";

      // Consulta de creación de tabla en SQLite
      $consulta = "CREATE TABLE $dbTabla (
          id INTEGER PRIMARY KEY,
          nombre VARCHAR($tamNombre),
          apellidos VARCHAR($tamApellidos)
          )";

Volver al principio de la página

## Bases de datos 2 - Añadir registros en la tabla

Amplie el ejercicio anterior de manera que permita incluir registros en la base de datos.

- El menú inicial incluye una opción de menú con un enlace a la página de creación de un nuevo registro.
- La creación del nuevo registro se hace en dos páginas, que incluyen un menú con un enlace a la página inicial.
  - La primera página contiene un formulario que pide los datos a registrar.
  - La segunda página inserta los datos en la base de datos.

Enlace a ejercicio Base de datos 1-2

### Comentarios

- Si el usuario intenta acceder directamente a la página que inserta el registro (escribiendo la dirección en el navegador), se le redireccionará directamente a la página inicial.
- El dato que introduce el usuario debe recogerse con la función recogeParaConsulta() comentada en los apuntes.
- Esta pueden ser las consultas de creación de tabla para este proyecto:

      // Añadir un registro
      $consulta = "INSERT INTO $dbTabla
       VALUES (NULL, $nombre, $apellidos)";

Volver al principio de la página

## Bases de datos 3 - Listar los registros en la tabla

Amplie el ejercicio anterior de manera que permita listar los registros de la base de datos.

- El menú inicial incluye una opción de menú con un enlace a la página que lista los registros existentes.
- El listado se hace en una página, que incluye un menú con un enlace a la página inicial.

Enlace a ejercicio Base de datos 1-3

### Comentarios

- Para listar los registros:

      // Seleccionar todos los registros
      $consulta = "SELECT * FROM $dbTabla";
      $result = $db->query($consulta);

      foreach ($result as $valor) {
      print "    <tr>
        <td>$valor[nombre]</td>
            <td>$valor[apellidos]</td>
          </tr>\n";

Volver al principio de la página

## Bases de datos 4 - Borrar individualmente registros en la tabla

Amplie el ejercicio anterior de manera que permita borrar individualmente los registros de la base de datos.

- El menú inicial incluye una opción de menú con un enlace a la página que permite borrar los registros existentes.
- El borrado se hace en dos páginas, que incluyen un menú con un enlace a la página inicial.
  - La primera página contiene un formulario que muestra los registros existentes y que permtie marcar los datos a borrar.
  - La segunda página borra los registros en la base de datos.

Enlace a ejercicio Base de datos 1-4

### Comentarios

- Para seleccionar los registros a borrar, se puede utilizar una casilla de verificación cuyo nombre contenga el id del registro. Lo mejor es que los nombres formen una matriz.

      // Imprime casilla de verificación
      print "     <td align=\"center\"><input type=\"checkbox\"".
            " name=\"id[$valor[id]]\" /></td>"

- Para borrar los registros:

      // Recoge los registros seleccionados
      $id = recogeMatrizParaConsulta($db, 'id');

      foreach ($id as $indice => $valor) {
          $consulta = "DELETE FROM $dbTabla
                       WHERE id=$indice";
          if ($db->query($consulta)) {
              print "<p>Registro borrado correctamente.</p>\n";
          } else {
              print "<p>Error al borrar el registro.</p>\n";
          }
      }

Volver al principio de la página

## Bases de datos 5 - Buscar registros en la tabla

Amplie el ejercicio anterior de manera que permita buscar registros de la base de datos.

- El menú inicial incluye una opción de menú con un enlace a la página que permite buscar en los registros existentes.
- El borrado se hace en dos páginas, que incluyen un menú con un enlace a la página inicial.
  - La primera página contiene un formulario que pide los datos a buscar.
  - La segunda página muestra los registros encontrados

Enlace a ejercicio Base de datos 1-5

### Comentarios

- La primera página es un formulario como el de añadir registros.
- Para buscar los registros, se puede utilizar la siguiente consulta.

      // Imprime casilla de verificación
      $nombre    = recogeParaConsulta($db, 'nombre');
      $nombre    = quitaComillasExteriores($nombre);
      $apellidos = recogeParaConsulta($db, 'apellidos');
      $apellidos = quitaComillasExteriores($apellidos);

      $consulta = "SELECT * FROM $dbTabla
              WHERE nombre LIKE '%$nombre%'
              AND apellidos LIKE '%$apellidos%'";

  La función RecogeParaConsulta inserta comillas al principio y al final de la cadena y esas comillas darían problemas en la consulta (para que se puedan hacer búsquedas parciales se ha añadido el comodín % al principio y final de la cadena de búsqueda y se han tenido que escribir las comillas). Así que hay que utilizar una función que quite esas comillas, que se encuentra en los apuntes.

Volver al principio de la página

## Bases de datos 6 - Modificar registros en la tabla

Amplie el ejercicio anterior de manera que permita modificar registros de la base de datos.

- El menú inicial incluye una opción de menú con un enlace a la página que permite modificar los registros existentes.
- La modificación se hace en tres páginas, que incluyen un menú con un enlace a la página inicial.
  - La primera página contiene un formulario que permite seleccionar el registro a modificar.
  - La segunda página muestra el registro seleccionado y permite modificarlo.
  - La tercera página guarda los datos modificados.

Enlace a ejercicio Base de datos 1-6

### Comentarios

- La primera página es un formulario como el de borrar, salvo que en vez de una casilla de verificación, se puede utilizar un botón radio cuyo valor contenga el id del registro.

      // Imprime botón radio
      print "     <td align=\"center\"><input type=\"radio\" "
          ."name=\"id\" value=\"$valor[id]\" /></td>"

- En la segunda página, para obtener el registro seleccionado, la consulta puede ser la siguiente (como sólo debe devolver un registro no tiene hacer una bucle foreach y es suficiente con utilizar el método: $result->fetch().

      // Recoge el registro seleccionado
      $id = recogeParaConsulta($db, 'id');

      $consulta = "SELECT * FROM $dbTabla WHERE id=$id";
      $result = $db->query($consulta);
      $valor = $result->fetch();

- La segunda página es un formulario como el de añadir, salvo que los campos contienen el valor del registro seleccionado en la primera página:

      // Muestra valor
      print "        <td><input type=\"text\" name=\"nombre\" size=\"$tamNombre\" "
          ."maxlength=\"$tamNombre\" value=\"$valor[nombre]\" id=\"cursor\" /></td>"

- En la segunda página hay que incluir en el formulario un control oculto que contenga el id del registro para pasarselo a la tercera página

      // Control oculto con el id del registro modificado
       <p><input type=\"hidden\" name=\"id\" value=\"$id\" />
          <input type=\"submit\" value=\"Actualizar\" /></p>

- En la tercera página, para modificar el registro seleccionado, la consulta puede ser la siguiente:

      // Modifica el registro seleccionado
      $nombre    = recogeParaConsulta($db, 'nombre');
      $apellidos = recogeParaConsulta($db, 'apellidos');
      $id        = recogeParaConsulta($db, 'id');

      $consulta = "UPDATE $dbTabla
                  SET nombre=$nombre, apellidos=$apellidos
                  WHERE id=$id";

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.