Manejo de Estado: Cookies y Sesiones

Colección de ejercicios prácticos sobre persistencia de datos en PHP.

Caso Práctico 1: Contador de Visitas (Cookies)

Este script utiliza una Cookie para recordar cuántas veces ha visitado un usuario la página. Al no especificar tiempo de expiración (o poner uno muy largo), el dato persiste aunque se cierre el navegador.

Archivo: contador.php

<?php
// 1. Verificamos si ya existe la cookie 'visitas'
if (isset($_COOKIE['visitas'])) {
    // Si existe, recuperamos el valor y sumamos 1
    $contador = $_COOKIE['visitas'] + 1;
} else {
    // Si no existe, es la primera visita
    $contador = 1;
}

// 2. Guardamos la cookie actualizada (Expira en 1 año)
// setcookie(nombre, valor, expiración)
setcookie('visitas', $contador, time() + (365 * 24 * 60 * 60));

// 3. Obtenemos fecha y hora actual
$fecha = date("d-m-Y");
$hora = date("H:i:s");
?>

<!-- Vista HTML -->
<h3>Contador de visitas</h3>
<p>Hola, hoy es <?php echo $fecha; ?> y son las <?php echo $hora; ?>.</p>
<p>Has accedido a esta página <strong><?php echo $contador; ?></strong> veces.</p>

Caso Práctico 2: Contador Temporal (Caducidad)

Modificación del ejercicio anterior para que la cookie tenga una vida útil de solo 1 minuto. Si el usuario tarda más de 60 segundos en recargar, el contador volverá a 1.

Modificación en la lógica:

<?php
if (isset($_COOKIE['visitas_temporales'])) {
    $contador = $_COOKIE['visitas_temporales'] + 1;
} else {
    $contador = 1;
}

// CAMBIO CLAVE: time() + 60 (60 segundos de vida)
setcookie('visitas_temporales', $contador, time() + 60);

echo "Visitas en el último minuto: " . $contador;
?>

Caso Práctico 3: Autenticación y Roles con Sesiones

Sistema de login que redirige a diferentes páginas según el usuario:

Paso 1: El Formulario (login.php)

<!DOCTYPE html>
<html lang="es">
<head><title>Login</title></head>
<body>
    <h2>Acceso de Usuarios</h2>
    <!-- Muestra error si existe en la URL -->
    <?php if(isset($_GET['error'])) echo "<p style='color:red'>Credenciales incorrectas</p>"; ?>

    <form action="validar.php" method="POST">
        Usuario: <input type="text" name="usuario"><br>
        Clave: <input type="password" name="password"><br>
        <button type="submit">Entrar</button>
    </form>
</body>
</html>

Paso 2: Lógica de Validación (validar.php)

<?php
session_start();

$user = $_POST['usuario'] ?? '';
$pass = $_POST['password'] ?? '';

// Credenciales hardcodeadas para el ejemplo
if ($user == 'admin' && $pass == '123456') {
    
    $_SESSION['usuario'] = 'admin';
    header("Location: deportes.php");

} elseif ($user == 'user' && $pass == '123456') {
    
    $_SESSION['usuario'] = 'user';
    header("Location: peliculas.php");

} else {
    // Si falla, volver al login con error
    header("Location: login.php?error=1");
}
?>

Paso 3: Páginas Protegidas (deportes.php)

Ejemplo de cómo proteger una página para que solo se pueda entrar si se ha iniciado sesión.

<?php
session_start();

// SEGURIDAD: Si no hay usuario en sesión, echarlo fuera
if (!isset($_SESSION['usuario'])) {
    die("Acceso denegado. <a href='login.php'>Iniciar Sesión</a>");
}
?>
<h1>Sección de Deportes</h1>
<p>Bienvenido, <?php echo $_SESSION['usuario']; ?></p>

<ul>
    <li>Fútbol</li>
    <li>Baloncesto</li>
    <li>Tenis</li>
</ul>

<a href="logout.php">Cerrar Sesión</a>

Paso 4: Cerrar Sesión (logout.php)

<?php
session_start();
session_destroy(); // Destruye la sesión
header("Location: login.php"); // Redirige al inicio
?>