Ejercicios - Bases de datos (3 C) - Ayuda

En construcciónEsta página de comentarios está en elaboración.

Esta página contiene comentarios ampliados con fragmentos de código PHP de los ejercicios Base de datos (3 C).

Bases de datos (3 C) - 1 - Mejoras en la aplicación

En construcciónPor escribir.

Bases de datos (3 C) - 2 - Nueva base de datos: PostgreSQL

En construcciónPor escribir.

Bases de datos (3 C) - 3 - Agenda multiusuario (1)

Modifique la aplicación de manera que cada usuario básico de la aplicación sólo pueda trabajar con sus propios registros de Personas (listar, borrar, buscar, modificar).

  1. Añada en la tabla Personas un campo que contenga el id del usuario que crea el registro.
    • [comunes/biblioteca-sqlite.php]
      // SQLITE:
          $consulta = "CREATE TABLE $cfg[tablaPersonas] (
                       id INTEGER PRIMARY KEY,
                       nombre VARCHAR($cfg[tablaPersonasTamNombre]) COLLATE NOCASE,
                       apellidos VARCHAR($cfg[tablaPersonasTamApellidos]) COLLATE NOCASE,
                       telefono VARCHAR($cfg[tablaPersonasTamTelefono]) COLLATE NOCASE,
                       correo VARCHAR($cfg[tablaPersonasTamCorreo]) COLLATE NOCASE,
                       id_usuario INTEGER,
                       FOREIGN KEY(id_usuario) REFERENCES $cfg[tablaUsuarios](id) ON DELETE CASCADE ON UPDATE CASCADE
                       )";
      
    • [comunes/biblioteca-mysql.php]
      // MYSQL:
                       $consulta = "CREATE TABLE $cfg[tablaPersonas] (
                                    id INTEGER UNSIGNED AUTO_INCREMENT,
                                    nombre VARCHAR($cfg[tablaPersonasTamNombre]),
                                    apellidos VARCHAR($cfg[tablaPersonasTamApellidos]),
                                    telefono VARCHAR($cfg[tablaPersonasTamTelefono]),
                                    correo VARCHAR($cfg[tablaPersonasTamCorreo]),
                                    id_usuario INTEGER UNSIGNED,
                                    FOREIGN KEY(id_usuario) REFERENCES $cfg[tablaUsuarios](id) ON DELETE CASCADE ON UPDATE CASCADE,
                                    PRIMARY KEY(id)
                                    )";
      
    • [comunes/biblioteca.php]

      Para que se puedan ordenar los listados por el campo usuario debemos añadirlo a la matriz $cfg["tablaPersonasColumnasOrden"]. Añadimos "usuario" y no "id_usuario" porque la columna mostrará el nombre del usuario.

      // Valores de ordenación de las tablas
      
      $cfg["tablaPersonasColumnasOrden"] = [
          "nombre ASC", "nombre DESC",
          "apellidos ASC", "apellidos DESC",
          "telefono ASC", "telefono DESC",
          "correo ASC", "correo DESC",
          "usuario ASC", "usuario DESC",
      ];
      
    • [comunes/demo.php]

      Los registros de prueba deben incluir el campo id_usuario. Por ejemplo:

      // Registros de prueba opcionales
      
      $cfg["registrosDemo"] = [
          [$cfg["tablaUsuarios"], [2, "usuario1", encripta("usuario1"), NIVEL_USUARIO_BASICO]],
          [$cfg["tablaUsuarios"], [3, "usuario2", encripta("usuario2"), NIVEL_USUARIO_BASICO]],
          [$cfg["tablaUsuarios"], [4, "admin1", encripta("admin1"), NIVEL_ADMINISTRADOR]],
          [$cfg["tablaPersonas"], [1, "Pepito", "Conejo", "271828182", "pepito.conejo@example.com", 2]],
          [$cfg["tablaPersonas"], [2, "Numa", "Nigerio", "161803398", "numa.nigerio@example.com", 2]],
          [$cfg["tablaPersonas"], [3, "Pepito", "Conejo", "271828182", "pepito.conejo@example.com", 3]],
          [$cfg["tablaPersonas"], [4, "Fulanito", "Mengánez", "314159265", "fulanito.menganez@example.com", 3]],
          [$cfg["tablaPersonas"], [5, "Napoleón", "Bonaparte", "432520032", "napoleon.bonaparte@example.org", 3]],
          [$cfg["tablaPersonas"], [6, "Julio", "César", "129644790 ", "julio.cesar@example.org", 4]],
      ];
      
  2. Al identificarse como usuario, guarde una variable de sesión con el id del usuario conectado.
    • [acceso/login-2.php]

      El guardar el id del usuario conectado como variable de sesión nos permite que cada página "sepa" quién está realizando las operaciones, de la misma manera que la variable de sesión "nivel" nos permite "saber" si el usuario está autorizado a visualizar la página.

      $_SESSION["conectado"]  = true;
      $_SESSION["nivel"]      = $registro["nivel"];
      $_SESSION["id_usuario"] = $registro["id"];
      
  3. Los usuarios básicos sólo podrán administrar sus propios registros (listar, borrar, buscar, modificar).

    En todas las consultas SELECT de las páginas de administración de la tabla Personas se debe añadir la condición de que el campo id_usuario tenga el mismo valor que la variable de sesión id_usuario. Este valor no hace falta incluirlo como parámetro de la consulta preparada, puesto que no es un dato que se reciba del usuario.

    Por ejemplo, en la página /db/tabla-personas/insertar-2.php, la consulta para comprobar si el registro que se quiere añadir ya existe sería ahora:

        $consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]
                     WHERE nombre = :nombre
                     AND apellidos = :apellidos
                     AND telefono = :telefono
                     AND correo = :correo
                     AND id_usuario = $_SESSION[id_usuario]";
    

    Y la consulta para comprobar si se ha superado el número máximo de registros permitidos en la tabla sería ahora:

            $consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]
                         WHERE id_usuario = $_SESSION[id_usuario]";
    

    En la consulta de inserción se tendrá que añadir el campo id_usuario:

                $consulta = "INSERT INTO $cfg[tablaPersonas]
                             (nombre, apellidos, telefono, correo, id_usuario)
                             VALUES (:nombre, :apellidos, :telefono, :correo, $_SESSION[id_usuario] )";
    
  4. Un usuario básico podrá insertar un registro de Personas con los mismos datos que un registro de otro usuario, pero no repetir un registro propio.

    La consulta para comprobar si el registro que se quiere añadir que se ha mostrado en el apartado anterior cumple este requisito.

  5. Los usuarios administradores podrán listar, borrar y buscar todos los registros de Personas.

      Las consultas deberá ser diferentes en función del nivel del usuario conectado.

    • Las consultas del usuario administrador no incluirán generalmente la condición de que el registro pertenezca al usuario. Por ejemplo, en db/tabla-personas/buscar-1.php:
      if ($_SESSION["nivel"] == NIVEL_ADMINISTRADOR) {
          $consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]";
      } else {
          $consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]
                       WHERE id_usuario = $_SESSION[id_usuario]";
      }
      

      Las consultas del administrador que devuelvan registros de Personas deberán combinar la tabla Personas con la tabla Usuarios para mostrar el nombre de usuario del usuario que creó el registro. Por ejemplo, en db/tabla-personas/listar.php:

      if ($_SESSION["nivel"] == NIVEL_ADMINISTRADOR) {
          $consulta = "SELECT
                           personas.id,
                           personas.nombre,
                           personas.apellidos,
                           personas.correo,
                           personas.telefono,
                           usuarios.usuario
                       FROM $cfg[tablaPersonas] as personas
                       JOIN $cfg[tablaUsuarios] as usuarios
                       ON personas.id_usuario = usuarios.id
                       ORDER BY $ordena";
      } else {
          $consulta = "SELECT * FROM $cfg[tablaPersonas]
                       WHERE id_usuario = $_SESSION[id_usuario]
                       ORDER BY $ordena";
      }
      
  6. En los listados (listar, borrar, buscar, modificar) los usuarios administradores verán el nombre del usuario que creó el registro.

    La columna Usuario se mostrará cuando el nivel del usuario conectado sea el nivel administrador.

    
        if ($_SESSION["nivel"] == NIVEL_ADMINISTRADOR) {
            print "            <th>\n";
            print "              <button name=\"ordena\" value=\"usuario ASC\" class=\"boton-invisible\">\n";
            print "                <img src=\"../../img/abajo.svg\" alt=\"A-Z\" title=\"A-Z\" width=\"15\" height=\"12\">\n";
            print "              </button>\n";
            print "              Usuario\n";
            print "              <button name=\"ordena\" value=\"usuario DESC\" class=\"boton-invisible\">\n";
            print "                <img src=\"../../img/arriba.svg\" alt=\"Z-A\" title=\"Z-A\" width=\"15\" height=\"12\">\n";
            print "              </button>\n";
            print "            </th>\n";
        }
    ...
            if ($_SESSION["nivel"] == NIVEL_ADMINISTRADOR) {
                print "            <td>$registro[usuario]</td>\n";
            }
    
    
  7. Compruebe que los usuarios administradores pueden ordenar los registros de personas por el campo usuario.

    En el primer apartado de este ejercicio ya se ha indicado cómo añadir los valores de ordenación a la variable de configuración $cfg["tablaPersonasColumnasOrden"].

  8. Los usuarios administradores no podrán insertar registros de Personas a nombre de otros usuarios, ni modificar el campo usuario de un registro de Personas. (esta funcionalidad se deja para el ejercicio siguiente)

    Si no se incluyen controles para ello en los formularios de db/tabla-personas/insertar-1.php o db/tabla-personas/modificar-2.php, los usuarios administradores no pueden realizar estas tareas.

Bases de datos (3 C) - 4 - Agenda multiusuario (2)

En construcciónPor escribir.

Bases de datos (3 C) - 5 - Campo de fecha

En construcciónPor escribir.