Ejercicios - Bases de datos (3) - Identificación de usuarios - Ayuda

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

Bases de datos (3) 1 - Identificación automática

En todo estos ejercicios, las páginas de gestión de la tabla deben mostrarse únicamente a los usuarios identificados. En este primer ejercicio, la identificación es automática, no se necesita indicar ningún nombre de usuario ni contraseña.

Bases de datos (3) 2 - Usuario único

En este ejercicio, el usuario debe identificarse indicando su nombre y contraseña, pero sólo existe un usuario, con nombre y contraseña fijos. La contraseña de este usuario no se guarda directamente, lo que se guarda es un hash de la contraseña.

Bases de datos (3) 3 - Tabla de usuarios

En este ejercicio se deben poder crear muchos usuarios distintos, con su nombre y contraseña. Todos los usuarios pueden realizar las mismas acciones.

Bases de datos (3) 4 - Categorías de usuarios

En este ejercicio se deben definir dos categorías de usuarios:


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

  1. Al borrar todo, ofrecer la opción de insertar automáticamente algunos registros de prueba.
    • [administrador/borrar-todo-1.php]

      Podemos incluir un control para que el usuario indique si quiere incluir registros de prueba en la base de datos ...

      print "      <p><label><input type=\"checkbox\" name=\"demo\" value=\"Sí\"> Incluir datos de prueba</label></p>\n";
      
    • [administrador/borrar-todo-2.php]

      ... recogerlo y en caso afirmativo, llamar a una función que incluya los registros de prueba:

      $demo   = recoge("demo");
      ...
      
      if ($demo == "Sí") {
          insertaDemo();
      }
      
    • [comunes/demo.php]

      Podemos indicar los registros a crear en una matriz e insertarlos recorriendo la matriz. En el ejemplo, los registros incluyen incluso el valor del id. En este caso no es necesario, pero sí lo sería si los registros de una tabla hicieran referencia a los registros de otra tabla, como ocurre en el ejercicio 4, por lo que preparamos ya el código para esa situación.

      // 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"]],
          [$cfg["tablaPersonas"], [2, "Numa", "Nigerio", "161803398", "numa.nigerio@example.com"]],
          [$cfg["tablaPersonas"], [3, "Fulanito", "Mengánez", "314159265", "fulanito.menganez@example.com"]],
      ];
      
      function insertaDemo()
      {
          global $cfg, $pdo;
      
          print "    <p>Insertando registros de prueba ...</p>\n";
          print "\n";
          foreach ($cfg["registrosDemo"] as $registro) {
              if ($registro[0] == $cfg["tablaUsuarios"]) {
                  $consulta = "INSERT INTO $cfg[tablaUsuarios]
                               (id, usuario, password, nivel)
                               VALUES ({$registro[1][0]}, '{$registro[1][1]}', '{$registro[1][2]}', {$registro[1][3]})";
              } elseif ($registro[0] == $cfg["tablaPersonas"]) {
                  $consulta = "INSERT INTO $cfg[tablaPersonas]
                               (id, nombre, apellidos, telefono, correo)
                               VALUES ({$registro[1][0]}, '{$registro[1][1]}', '{$registro[1][2]}', '{$registro[1][3]}', '{$registro[1][4]}')";
              }
      
              if (!$pdo->query($consulta)) {
                  print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
              } else {
                  print "    <p>Registro creado correctamente.</p>\n";
              }
              print "\n";
          }
      }
      
  2. En SQLite, si no existe el directorio donde se quiere guardar la base de datos, mostrar un mensaje indicando el problema.
    • [comunes/biblioteca-sqlite.php]

      Podemos aplicar la función dirname(), que devuelve el camino padre (en este caso, elimina el nombre del archivo), a la variable de configuración $cfg["sqliteDatabase"]. Y a su resultado la función is_dir(), que indica si el camino es un directorio (es decir, si existe).

      function conectaDb()
      {
          global $cfg;
      
          if (!is_dir(dirname($cfg["sqliteDatabase"]))) {
              print "    <p class=\"aviso\">Error: El directorio <strong>" . dirname($cfg["sqliteDatabase"]) . "</strong> no está disponible.</p>\n";
              exit;
          } else {
              ...
      
  3. Al modificar el registro de un usuario, ofrecer la posibilidad de mantener la contraseña (por ejemplo, marcando una casilla).
    • [db/tabla-usuarios/modificar-2.php]

      En el formulario incluimos una casilla de verificación ...

              print "          <tr>\n";
              print "            <td>Contraseña:</td>\n";
              print "            <td>\n";
              print "              <input type=\"text\" name=\"password\" size=\"$cfg[formUsuariosTamPassword]\" maxlength=\"$cfg[formUsuariosTamPassword]\">\n";
              print "              <input type=\"checkbox\" name=\"mantenerPassword\" value=\"Sí\"> Mantener contraseña actual\n";
              print "            </td>\n";
              print "          </tr>\n";
      
    • [db/tabla-usuarios/modificar-3.php]

      ... recogemos el control y en función de su valor mantenemos o cambiamos la contraseña:

      $mantenerPassword = recoge("mantenerPassword");
      ...
                      } elseif ($mantenerPassword == "Sí") {
                          $consulta = "UPDATE $cfg[tablaUsuarios]
                                       SET usuario = :usuario, nivel = :nivel
                                       WHERE id = :id";
                          $resultado = $pdo->prepare($consulta);
                          if (!$resultado) {
                              print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
                          } elseif (!$resultado->execute([":usuario" => $usuario, ":nivel" => $nivel, ":id" => $id])) {
                              print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
                          } else {
                              print "    <p>Registro modificado correctamente.</p>\n";
                          }
                      } else {
                          $consulta = "UPDATE $cfg[tablaUsuarios]
                                       SET usuario = :usuario, password = :password, nivel = :nivel
                                       WHERE id = :id";
                          $resultado = $pdo->prepare($consulta);
                          if (!$resultado) {
                              print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
                          } elseif (!$resultado->execute([":usuario" => $usuario, ":password" => encripta($password), ":nivel" => $nivel, ":id" => $id])) {
                              print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
                          } else {
                              print "    <p>Registro modificado correctamente.</p>\n";
                          }
      
      
  4. Hacer que no se aplique el límite del número de registros en las tablas si el valor de $cfg["tablaPersonasMaxReg"] o $cfg["tablaUsuariosMaxReg"] es 0 o negativo.
    • [db/tabla-personas/insertar-1.php, db/tabla-personas/insertar-2.php, db/tabla-usuarios/insertar-1.php, db/tabla-usuarios/insertar-2.php]

      Modificamos la condición de superación del número máximo de registros para que no se cumpla si la variable de configuración no es mayor que 0:

          ...
      } elseif ($resultado->fetchColumn() >= $cfg["tablaUsuariosMaxReg"] && $cfg["tablaUsuariosMaxReg"] > 0) {
          ...