Programación Web • ITI-07 •
Práctica: Mini Sistema Web Universitario - 1
Práctica: Mini Sistema Web Universitario - 1
Configuración inicial del proyecto
config/conexion.php
<?php
$servidor = "localhost";
$usuario = "root";
$contrasena = "";
$base_datos = "sistema_universitario";
$conexion = mysqli_connect($servidor, $usuario, $contrasena, $base_datos);
if (!$conexion) {
die("Error de conexión: " . mysqli_connect_error());
}
echo "Conexión exitosa a la base de datos.";
?>
index.php
<?php
session_start();
// Esra funcion se va encargar de que si un usuario ya tiene una sesion iniciada lo rediriga al dashboard
/*if (isset($_SESSION["usuario_id"])) {
header("Location: dashboard.php");
exit();
}*/
// Esto nos sirve para oncluir la conexion a la Base de Datos
require_once "config/conexion.php";
// Estas variables nos serciran para los mensajes que se mostraran
$error = "";
$mensaje = "";
// Procesar el formulario cuando se envia
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//Se validara que los campos no esten vacios
if (empty($_POST["usuario"]) || empty($_POST["password"])) {
$error = "Por favor, complete todos los campos.";
} else {
$usuario = trim($_POST["usuario"]);
$password = $_POST["password"];
// Esto nos sirve para preparar la consulta y evitar inyecciones SQL
$stmt = $conexion->prepare(
"SELECT id, usuario, password, nombre_completo FROM usuarios WHERE usuario = ?",
);
$stmt->bind_param("s", $usuario);
$stmt->execute();
$resultado = $stmt->get_result();
if ($resultado->num_rows === 1) {
$usuario_db = $resultado->fetch_assoc();
// Nos sirve para verificar la contraseña con password_verify (Es seduro)
if (
password_verify(
password: $password,
hash: $usuario_db["password"],
)
) {
// Si las credenciales son correctas - Se inicia la sesion
$_SESSION["usuario_id"] = $usuario_db["id"];
$_SESSION["usuario"] = $usuario_db["usuario"];
$_SESSION["nombre_completo"] = $usuario_db["nombre_completo"];
// Regenera el ID de la session para prevenir session fixation
session_regenerate_id(true);
// Redirige al dashboard
header("Location: dashboard.php");
exit();
} else {
$error = "Usuario o Contraseña incorrectos";
}
} else {
$error = "Usuario o Contraseña incorrectos";
}
$stmt->close();
}
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body class="login-page">
<div class="login-container">
<div class="logo">
<h1>Sistema Universitario - CLA</h1>
<p>gestion de tareas academicas</p>
</div>
<?php if ($error): ?>
<div class="alert alert-error">
<?php echo htmlspecialchars($error); ?>
</div>
<?php endif; ?>
<?php if ($mensaje): ?>
<div class="alert alert-success">
<?php echo htmlspecialchars($mensaje); ?>
</div>
<?php endif; ?>
<form method="POST" action="">
<div class="form-group">
<label for="usuario">Usuario:</label>
<input type="text" id="usuario" name="usuario" required autocomplete="username">
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" required autocomplete="current-password">
</div>
<button type="submit" class="btn-login">Iniciar sesion</button>
</form>
<div class="info-box">
<h3>usuario de prueba</h3>
<p><strong>Usuario:</strong> alumno1 | <strong>Contraseña:</strong> password123</p>
</div>
</div>
</body>
</html>
Base de datos (ejecuten en workbench o sqlyog)
-- Script de creación de base de datos para el Sistema Universitario
-- Ejecutar este script antes de usar el sistema
CREATE DATABASE IF NOT EXISTS sistema_universitario;
USE sistema_universitario;
-- Tabla de usuarios
CREATE TABLE IF NOT EXISTS usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
nombre_completo VARCHAR(100),
fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla de tareas
CREATE TABLE IF NOT EXISTS tareas (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
nombre_archivo VARCHAR(255) NOT NULL,
nombre_original VARCHAR(255) NOT NULL,
fecha DATETIME DEFAULT CURRENT_TIMESTAMP,
tamano_bytes INT,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- IMPORTANTE: Después de ejecutar este script, ejecuta crear_usuarios.php
-- para generar usuarios de prueba con contraseñas hasheadas correctamente.
-- O ejecuta estas consultas manualmente después de obtener el hash:
-- INSERT INTO usuarios (usuario, password, nombre_completo) VALUES ('alumno1', 'HASH_AQUI', 'Juan Pérez');
-- Para obtener el hash correcto:
-- Ejecuta: http://localhost/mini-sistema/crear_usuarios.php
crearusuarios.php (generado por IA para tener usuarios de pruebas, por que me equivoque con el que les di antes)
<?php
/**
* crear_usuarios.php
* Script de instalación de usuarios de prueba
* Ejecutar DESPUÉS de importar database.sql
*/
// Incluir conexión
require_once 'config/conexion.php';
// Contraseña que usaremos para todos
$password_texto = "password123";
$password_hash = password_hash($password_texto, PASSWORD_DEFAULT);
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Crear Usuarios de Prueba</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 50px auto;
padding: 20px;
background: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.success {
background: #d4edda;
border: 1px solid #c3e6cb;
color: #155724;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
}
.error {
background: #f8d7da;
border: 1px solid #f5c6cb;
color: #721c24;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
}
.info {
background: #d1ecf1;
border: 1px solid #bee5eb;
color: #0c5460;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
th,
td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th {
background: #667eea;
color: white;
}
.btn {
display: inline-block;
padding: 12px 30px;
background: #667eea;
color: white;
text-decoration: none;
border-radius: 5px;
margin-top: 20px;
}
code {
background: #f4f4f4;
padding: 2px 6px;
border-radius: 3px;
font-family: monospace;
}
</style>
</head>
<body>
<div class="container">
<h1>🎓 Crear Usuarios de Prueba</h1>
<?php
// Verificar conexión
if ($conexion->connect_error) {
echo "<div class='error'>❌ Error de conexión: " . $conexion->connect_error . "</div>";
echo "<p>Verifica la configuración en <code>config/conexion.php</code></p>";
exit();
}
echo "<div class='success'>✅ Conexión a la base de datos exitosa</div>";
// Usuarios a crear
$usuarios = array(
array('alumno1', 'Juan Pérez'),
array('alumno2', 'María García'),
array('profesor1', 'Dr. Carlos Rodríguez')
);
$usuarios_creados = 0;
$usuarios_existentes = 0;
echo "<h2>Creando usuarios...</h2>";
foreach ($usuarios as $user) {
$usuario = $user[0];
$nombre = $user[1];
// Verificar si el usuario ya existe
$check = $conexion->prepare("SELECT id FROM usuarios WHERE usuario = ?");
$check->bind_param("s", $usuario);
$check->execute();
$result = $check->get_result();
if ($result->num_rows > 0) {
// Usuario existe - actualizar contraseña
$update = $conexion->prepare("UPDATE usuarios SET password = ?, nombre_completo = ? WHERE usuario = ?");
$update->bind_param("sss", $password_hash, $nombre, $usuario);
if ($update->execute()) {
echo "<div class='info'>ℹ️ Usuario <strong>$usuario</strong> ya existía - contraseña actualizada</div>";
$usuarios_existentes++;
} else {
echo "<div class='error'>❌ Error al actualizar usuario $usuario</div>";
}
$update->close();
} else {
// Usuario no existe - crear nuevo
$insert = $conexion->prepare("INSERT INTO usuarios (usuario, password, nombre_completo) VALUES (?, ?, ?)");
$insert->bind_param("sss", $usuario, $password_hash, $nombre);
if ($insert->execute()) {
echo "<div class='success'>✅ Usuario <strong>$usuario</strong> creado correctamente</div>";
$usuarios_creados++;
} else {
echo "<div class='error'>❌ Error al crear usuario $usuario: " . $insert->error . "</div>";
}
$insert->close();
}
$check->close();
}
// Mostrar resumen
echo "<hr>";
echo "<h2>📊 Resumen</h2>";
echo "<p>✅ Usuarios nuevos creados: <strong>$usuarios_creados</strong></p>";
echo "<p>ℹ️ Usuarios actualizados: <strong>$usuarios_existentes</strong></p>";
// Mostrar todos los usuarios
echo "<h2>👥 Usuarios en el sistema</h2>";
$todos = $conexion->query("SELECT id, usuario, nombre_completo, fecha_registro FROM usuarios ORDER BY id");
if ($todos && $todos->num_rows > 0) {
echo "<table>";
echo "<thead><tr><th>ID</th><th>Usuario</th><th>Nombre Completo</th><th>Fecha Registro</th></tr></thead>";
echo "<tbody>";
while ($row = $todos->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td><strong>" . htmlspecialchars($row['usuario']) . "</strong></td>";
echo "<td>" . htmlspecialchars($row['nombre_completo']) . "</td>";
echo "<td>" . $row['fecha_registro'] . "</td>";
echo "</tr>";
}
echo "</tbody></table>";
}
// Información de acceso
echo "<div class='info'>";
echo "<h3>🔑 Información de Acceso</h3>";
echo "<p><strong>Contraseña para todos los usuarios:</strong> <code>password123</code></p>";
echo "<ul>";
echo "<li>Usuario: <code>alumno1</code> - Juan Pérez</li>";
echo "<li>Usuario: <code>alumno2</code> - María García</li>";
echo "<li>Usuario: <code>profesor1</code> - Dr. Carlos Rodríguez</li>";
echo "</ul>";
echo "</div>";
// Verificar que el hash funciona
echo "<h2>🔐 Verificación de Hash</h2>";
if (password_verify($password_texto, $password_hash)) {
echo "<div class='success'>✅ El hash de contraseña es válido y funciona correctamente</div>";
echo "<p>Hash generado: <code>$password_hash</code></p>";
} else {
echo "<div class='error'>❌ Error: El hash no es válido</div>";
}
$conexion->close();
?>
<hr>
<h2>✅ ¡Listo para usar!</h2>
<p>Ahora puedes iniciar sesión en el sistema:</p>
<a href="index.php" class="btn">Ir al Sistema</a>
<div
style="margin-top: 30px; padding: 15px; background: #fff3cd; border-left: 4px solid #ffc107; border-radius: 5px;">
<strong>⚠️ Importante:</strong> Puedes ejecutar este script las veces que necesites.
Si los usuarios ya existen, simplemente actualizará sus contraseñas a <code>password123</code>
</div>
</div>
</body>
</html>