Esta 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).
Por escribir.
Por escribir.
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).
// 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
)";
// 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)
)";
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",
];
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]],
];
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"];
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] )";
La consulta para comprobar si el registro que se quiere añadir que se ha mostrado en el apartado anterior cumple este requisito.
Las consultas deberá ser diferentes en función del nivel del usuario conectado.
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";
}
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";
}
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"].
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.
Por escribir.
Por escribir.