# 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

- Para recoger los datos, se aconseja utilizar la función de recogida de datos con un valor precdeterminado que se comenta en la lección de recogida de datos. En estos ejercicios no se utilizarán los valores predeterminados, pero sí en los ejercicios Bases de datos 2.
- Esta puede ser la consulta preparada de inserción:

      // Añadir un registro
      $nombre    = recoge('nombre');
      $apellidos = recoge('apellidos');

      $consulta = "INSERT INTO $dbTabla
          (nombre, apellidos)
          VALUES (:nombre, :apellidos)";
      $result = $db->prepare($consulta);
      if ($result->execute(array(':nombre' => $nombre, ':apellidos' => $apellidos))) {
          print "<p>Registro creado correctamente.</p>\n";
      } else {
          print "<p>Error al crear el registro.</p>\n";
      }

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, esta puede ser la consulta de selección:

      // 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
      $consulta = "SELECT * FROM $dbTabla";
      $result = $db->query($consulta);

      foreach ($result as $valor) {
          print "     <td align=\"center\"><input type=\"checkbox\"".
                " name=\"id[$valor[id]]\" /></td>";
      }

- Para borrar los registros, esta puede ser la consulta preparada de borrado:

      // Recoge los registros seleccionados
      $id = recogeMatriz('id');

      foreach ($id as $indice => $valor) {
          $consulta = "DELETE FROM $dbTabla
              WHERE id=:indice";
          $result = $db->prepare($consulta);
          if ($result->execute(array(':indice' => $indice))) {
              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, esta puede ser la consulta preparada de selección:

      // Imprime casilla de verificación
      $nombre    = recoge('nombre');
      $apellidos = recoge('apellidos');

      $consulta = "SELECT * FROM $dbTabla
          WHERE nombre LIKE :nombre
          AND apellidos LIKE :apellidos";
      $result = $db->prepare($consulta);
      $result->execute(array(':nombre' => "%$nombre%", ':apellidos' => "%$apellidos%"));

  El comodín debe incluirse al ejecutar la consulta, no se podrían incluir en la definición de $consulta.

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
      $consulta = "SELECT * FROM $dbTabla";
      $result = $db->query($consulta);

      foreach ($result as $valor) {
          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 = recoge('id');

      $consulta = "SELECT * FROM $dbTabla
          WHERE id=:id";
      $result = $db->prepare($consulta);
      $result->execute(array(':id' => $id));
      $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]\" /></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, esta puede ser la consulta preparada de actualización:

      $nombre    = recoge('nombre');
      $apellidos = recoge('apellidos');
      $id        = recoge('id');

      $consulta = "UPDATE $dbTabla
          SET nombre=:nombre, apellidos=:apellidos
          WHERE id=:id";
      $result = $db->prepare($consulta);
      if ($result->execute(array(':nombre' => $nombre, ':apellidos' => $apellidos, ':id' => $id))) {
          print "<p>Registro modificado correctamente.</p>\n";
      } else {
          print "<p>Error al modificar el registro.</p>\n";
      }

Volver al principio de la página

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