๐ Ejercicio 9: Sistema de login con sesiones en PHP
๐ Planteamiento:
Crea un sistema bรกsico de login en PHP que:
- ✅ Use una tabla
usuarioscon nombre_usuario y contraseรฑa (almacenada conpassword_hash()). - ✅ Permita iniciar sesiรณn validando credenciales.
- ✅ Use $_SESSION para mantener al usuario autenticado.
- ✅ Muestre una pรกgina protegida donde se vea el nombre del usuario logueado.
- ✅ Incluya un botรณn para cerrar sesiรณn.
✅ Modelo de soluciรณn:
<?php
session_start();
// ๐ Conexiรณn a MySQL
$dsn = "mysql:host=localhost;dbname=curso_php;charset=utf8";
$usuario = "root";
$contrasena = "";
try {
$pdo = new PDO($dsn, $usuario, $contrasena);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("❌ Error de conexiรณn: " . $e->getMessage());
}
// ๐ Crear tabla usuarios si no existe
$pdo->exec("CREATE TABLE IF NOT EXISTS usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre_usuario VARCHAR(50) UNIQUE NOT NULL,
contrasena VARCHAR(255) NOT NULL
)");
// ๐ Crear usuario demo si no existe
$consulta = $pdo->prepare("SELECT COUNT(*) FROM usuarios WHERE nombre_usuario = ?");
$consulta->execute(['admin']);
if ($consulta->fetchColumn() == 0) {
$hash = password_hash('1234', PASSWORD_DEFAULT);
$pdo->prepare("INSERT INTO usuarios (nombre_usuario, contrasena) VALUES (?, ?)")
->execute(['admin', $hash]);
}
// ๐ฅ Procesar login
if (isset($_POST['login'])) {
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE nombre_usuario = ?");
$stmt->execute([$_POST['usuario']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($_POST['contrasena'], $user['contrasena'])) {
$_SESSION['usuario'] = $user['nombre_usuario'];
header("Location: dashboard.php");
exit;
} else {
$error = "❌ Usuario o contraseรฑa incorrectos.";
}
}
// ๐ฅ Procesar logout
if (isset($_GET['logout'])) {
session_destroy();
header("Location: login.php");
exit;
}
?>
<!-- ๐ FORMULARIO LOGIN -->
<?php if (!isset($_SESSION['usuario'])): ?>
<h3>Iniciar sesiรณn</h3>
<form method="post">
<input type="text" name="usuario" placeholder="Usuario" required>
<input type="password" name="contrasena" placeholder="Contraseรฑa" required>
<button type="submit" name="login">Entrar</button>
</form>
<?php if (isset($error)) echo "<p style='color:red'>$error</p>"; ?>
<?php else: ?>
<h3>Bienvenido, <?php echo $_SESSION['usuario']; ?></h3>
<p>Esta es la pรกgina protegida. Solo usuarios autenticados pueden verla.</p>
<a href="?logout=1">Cerrar sesiรณn</a>
<?php endif; ?>
๐ฏ Claves de este ejercicio:
- ๐ Uso de
password_hash()ypassword_verify()para mayor seguridad. - ๐ Gestiรณn de sesiรณn con
$_SESSIONpara mantener el estado del usuario. - ๐ Estructura bรกsica de un login real (formulario, validaciรณn, redirecciรณn).
- ๐ Botรณn de logout para terminar sesiรณn.
No hay comentarios:
Publicar un comentario