Sesiones en PHP: login y logout básico

Resumen

Aprender a manejar sesiones en PHP es el primer paso para construir sistemas de autenticación reales. Aquí verás cómo iniciar, mantener y destruir una sesión usando la variable superglobal $_SESSION, ideal si ya conoces lo básico de PHP y quieres pasar a la lógica de usuarios logueados.

La idea es simple: simular un mini sistema donde un usuario puede entrar, ver su perfil personalizado y cerrar sesión, sin base de datos todavía, pero con la mecánica exacta que usarás cuando la conectes.

¿Cómo saber si un usuario inició sesión en PHP?

La forma más directa es preguntarle a PHP si existe un dato dentro de $_SESSION, normalmente el ID del usuario. Si está definido, hay sesión activa. Si no, el usuario es un visitante anónimo.

En un archivo index.php que simula tu página de perfil, la lógica se ve así:

php

<?php session_start(); ?> <?php if (isset($_SESSION['id'])): ?> <h1>Hola <?= $_SESSION['username'] ?></h1> <p>Tu email es <?= $_SESSION['email'] ?></p> <?php else: ?> <h1>No has iniciado sesión :(</h1> <?php endif; ?>

Fíjate en algo crítico: session_start() va al inicio de toda página que use sesiones. Sin esa función, PHP no carga los datos guardados y tu condición siempre dará falso, aunque el usuario sí se haya logueado en otra página.

¿Qué hace session_start en PHP? Le indica a PHP que va a leer o escribir datos en la sesión actual. Sin ella, la superglobal $_SESSION queda vacía aunque ya hayas guardado información antes.

¿Cómo iniciar una sesión con datos del usuario?

Para este ejemplo se crea un archivo login.php que simula una base de datos con un arreglo de usuarios. No es un login real con contraseña, es un selector que recibe el usuario por la URL usando $_GET.

php

<?php session_start(); $users = [ ['username' => 'retaxito', 'email' => 'retaxito@noesmiemail.com'], ['username' => 'mrmichi', 'email' => 'mrmichi@noesmiemail.com'] ]; $user = $_GET['user'] ?? ''; $_SESSION['id'] = $user; $_SESSION['username'] = $users[$user]['username']; $_SESSION['email'] = $users[$user]['email']; echo 'El usuario elegido es ' . $users[$user]['username']; Al visitar `login.php?user=1`, PHP toma el segundo elemento del arreglo (Mr. Michi), guarda su id, username y email dentro de `$_SESSION` y desde ese momento esos datos quedan disponibles en cualquier otra página del sitio. Los nombres de las claves como `id`, `username` o `email` los inventas tú. Podrías llamarle `queso` y funcionaría igual, lo que importa es ser consistente al leerlas después. ### ¿Qué diferencia hay con un login real? En un sistema profesional no eliges al usuario por URL. Recibes username y password desde un formulario, los comparas contra lo guardado en la base de datos y solo si hacen *match* defines las variables de sesión. La parte de `$_SESSION['id']`, `$_SESSION['username']`, etc., es idéntica. Lo que cambia es la validación previa. > **¿Qué es `$_SESSION` en PHP?** Es una variable superglobal que actúa como almacén persistente entre páginas. Lo que guardes ahí estará disponible mientras la sesión siga activa, sin importar a qué archivo navegue el usuario. ## ¿Cómo cerrar sesión con session_destroy? El logout es la parte más corta del sistema. Creas un archivo `logout.php` con apenas dos líneas de lógica: php <?php session_start(); session_destroy(); `session_start()` carga la sesión existente y `session_destroy()` la elimina por completo. Después de visitar esta página, si el usuario regresa al `index.php`, verá el mensaje de "No has iniciado sesión" porque ya no existen los datos en `$_SESSION`. > **¿Cuándo uso session_start y cuándo session_destroy?** Usa `session_start()` al inicio de cada archivo que lea o escriba en la sesión. Usa `session_destroy()` solo cuando quieras eliminar todos los datos, típicamente en el logout. ## Habilidades y conceptos que aplicas con sesiones en PHP A lo largo del ejercicio practicas varias piezas que se conectan entre sí: - **Variable superglobal `$_SESSION`**: el contenedor donde viven los datos del usuario logueado [01:25]. - **Función `session_start()`**: obligatoria en cada archivo que use sesiones, sin ella nada funciona [07:30]. - **Función `session_destroy()`**: borra la sesión completa para cerrar el acceso [10:45]. - **`isset()` aplicado a `$_SESSION`**: la forma estándar de detectar si hay un usuario logueado [01:40]. - **Superglobal `$_GET`**: en este caso simula el envío de credenciales, en producción se reemplaza por `$_POST` desde un formulario [05:10]. - **Arreglos asociativos como mock de base de datos**: útiles para prototipar antes de conectar MySQL [04:20]. La lógica de fondo siempre es la misma: preguntar si la sesión está iniciada, actuar en consecuencia y destruirla cuando el usuario quiera salir. Cuando le sumes base de datos y formularios, la estructura no cambia, solo se vuelve más robusta. ¿Ya probaste replicar este flujo en tu propio proyecto? Cuéntame en los comentarios con qué usuario decidiste loguearte primero.