Continuando con la publicación pasada en donde habíamos aprendido cookies, una de las formas de guardar información del visitante de nuestro sitio para que ésta esté disponible entre página y página. En esta ocasión aprenderemos otra de las formas: sesiones.
Cookies Vs Sesiones
Habíamos dicho que ambas tienen un mismo fin: guardar información del visitante entre página y página, sin embargo hay algo que diferencia a ambas formas que hay que tener muy presente a la hora de crear nuestra aplicación web.
Tanto los cookies como las sesiones, son una especia de comunicación, una identificación que hay entre el navegador del visitante y el servidor web. En la publicación pasada guardábamos el nombre del visitante, por ejemplo «Juan», sin embargo ese valor se está guardando en el navegador del usuario, eso significa que un usuario de internet con conocimientos medios puede modificar ese valor, ya que está en su propio disco duro.
Pensemos en algo un poco más complejo que guardar un simple nombre: un login. El usuario ingresa su nombre y su contraseña, se buscan estos datos en una base de datos y se guarda un identificador, un número. Si ese número, que corresponde a ese usuario se guarda en una cookie, el visitante puede modificar esa cookie, y hacerse pasar por otro usuario. Sin embargo con una sesión, eso no pasaría, ya que los valores, por ejemplo ese identificador se guardarán en el servidor y no en el navegador.
Iniciar sesión
Cuando trabajemos con sesiones en nuestro script debemos incluir la siguiente función:
session_start();
Si no existe una sesión actualmente creará una, de lo contrario continuará con la sesión abierta hasta el momento.
Guardar valores en sesión
Las sesiones, al igual que las cookies son un array asociativo. Por ejemplo para guardar el nombre de usuario dentro de una sesión deberíamos hacer lo siguiente:
$_SESSION['nombre'] = 'fernando';
Y obviamente para acceder al mismo llamar a ese array $_SESSION con el índice correspondiente:
$_SESSION['nombre'];
Eliminar valores de sesión
Siguiendo con el ejemplo ‘nombre’, si quisiéramos eliminarlo deberíamos utilizar la función unset() que lo que hará es destruir variables e índices de arrays, incluso los de una sesión:
unset($_SESSION['nombre']);
Finalizar sesión
Si en cambio lo que queremos hacer es eliminar absolutamente la sesión, debemos usar lo siguiente:
session_destroy();
Sin embargo, yo aconsejo no usar esta función, ya que romperá la sesión y con ella todos sus índice y valores. Nosotros independientemente de si el usuario está logueado o no, podemos llevar un control para saber por ejemplo cuántas veces ha iniciado sesión y a qué página ha ingresado.
Para entender mejor cómo funciona esto de las sesiones vamos a crear un pequeño proyecto con tres archivos a los que yo voy a llamar: index.php, usuario.php y cerrar_sesion.php.
Dentro de index.php vamos a escribir el siguiente código:
<?php
session_start();
$usuarios = array(
array('nombre' => 'roberto', 'contrasena' => '1234'),
array('nombre' => 'jorge', 'contrasena' => '1234'),
array('nombre' => 'toni', 'contrasena' => '1234')
);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$nombre = $_POST['nombre'];
$contrasena = $_POST['contrasena'];
//Creamos una variable para verificar si el usuario con ese nombre y contraseña existe.
$usuario_encontrado = false;
foreach($usuarios as $item){
//Si encuentra al usuario con ese nombre y contraseña sete la variable $usuario_encontrado a true y rompe el bucle para no seguir buscando.
if($nombre == $item['nombre'] and $contrasena == $item['contrasena']){
$usuario_encontrado = true;
break;
}
}
//Verifica si dentro del bucle se ha encontrado el usuario.
if($usuario_encontrado){
$_SESSION['logueado'] = true;
$_SESSION['nombre'] = $nombre;
header('Location: usuario.php');
exit;
}else{
$error_login = true;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> Logueo </title>
</head>
<body>
<?php if(isset($error_login)): ?>
<span style="color: #f00;"> El usuario o la contraseña son incorrectos. </span>
<?php endif; ?>
<form method="post" action="index.php">
<label for="nombre"> Nombre </label>
<input type="text" name="nombre" id="nombre" required="required" />
<label for="contrasena"> Contraseña </label>
<input type="password" name="contrasena" id="contrasena" required="required" />
<input type="submit" value="Enviar" />
</form>
</body>
</html>
En primer lugar creamos un formulario para ingresar un nombre de usuario y la contraseña, nada nuevo:
<form method="post" action="index.php"> <label for="nombre"> Nombre </label> <input type="text" name="nombre" id="nombre" required="required" /> <label for="contrasena"> Contraseña </label> <input type="password" name="contrasena" id="contrasena" required="required" /> <input type="submit" value="Enviar" /> </form>
Luego, en la cabecera verificamos si ha llegado una petición por POST, de la acción al recibir el formulario:
<?php
session_start();
$usuarios = array(
array('nombre' => 'roberto', 'contrasena' => '1234'),
array('nombre' => 'jorge', 'contrasena' => '1234'),
array('nombre' => 'toni', 'contrasena' => '1234')
);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$nombre = $_POST['nombre'];
$contrasena = $_POST['contrasena'];
//Creamos una variable para verificar si el usuario con ese nombre y contraseña existe.
$usuario_encontrado = false;
foreach($usuarios as $item){
//Si encuentra al usuario con ese nombre y contraseña sete la variable $usuario_encontrado a true y rompe el bucle para no seguir buscando.
if($nombre == $item['nombre'] and $contrasena == $item['contrasena']){
$usuario_encontrado = true;
break;
}
}
//Verifica si dentro del bucle se ha encontrado el usuario.
if($usuario_encontrado){
$_SESSION['logueado'] = true;
$_SESSION['nombre'] = $nombre;
header('Location: usuario.php');
exit;
}else{
$error_login = true;
}
}
?>
Bueno, como dijimos antes, cuando trabajamos con sesiones debemos llamar dentro de nuestro script a la función session_start():
session_start();
Y también tendremos un array con una lista de usuarios, esto se debe a que todavía no hemos trabajado con base de datos, así que vamos a simular una:
$usuarios = array(
array('nombre' => 'roberto', 'contrasena' => '1234'),
array('nombre' => 'jorge', 'contrasena' => '1234'),
array('nombre' => 'toni', 'contrasena' => '1234')
);
Bien, ahora vamos a analizar el código dentro del if que verifica si se ha enviado el formulario:
Primero guardamos los datos de usuario y contraseña:
$nombre = $_POST['nombre']; $contrasena = $_POST['contrasena'];
Creamos una variable $usuario_encontrado que guardaré el resultado de si existe algún usuario con ese nombre y contraseña, por defecto será false.
$usuario_encontrado = false;
Luego con un foreach recorremos la lista de usuarios:
foreach($usuarios as $item){
//Si encuentra al usuario con ese nombre y contraseña sete la variable $usuario_encontrado a true y rompe el bucle para no seguir buscando.
if($nombre == $item['nombre'] and $contrasena == $item['contrasena']){
$usuario_encontrado = true;
break;
}
}
En cada loop preguntamos si el nombre de usuario y la contraseña coinciden con la posición en que estamos parados y de ser así seteamos la variable $usuario_encontrado a true y rompemos el ciclo de repetición, ya no es necesario seguir comprobando:
if($nombre == $item['nombre'] and $contrasena == $item['contrasena']){
$usuario_encontrado = true;
break;
}
Finalmente con un if verificamos si el usuario ha sido encontrado con ese nombre y contraseña:
if($usuario_encontrado){
$_SESSION['logueado'] = true;
$_SESSION['nombre'] = $nombre;
header('Location: usuario.php');
exit;
}else{
$error_login = true;
}
De ser así, entonces seteamos dos índices en nuestra sesión, ‘logueado’ a true, para comprobar en el resto de nuestra página si el usuario ha iniciado una sesión correctamente, y ‘nombre’ con el nombre del usuario, valga la redundancia. Además lo redireccionamos a una página principal para usuarios, que editaremos en un momento:
$_SESSION['logueado'] = true;
$_SESSION['nombre'] = $nombre;
header('Location: usuario.php');
exit;
Pero si el nombre de usuario y la contraseña están mal, entonces creamos una variable $error_login:
$error_login = true;
Para luego mostrar el mensaje de error dentro del código html:
<?php if(isset($error_login)): ?>
<span style="color: #f00;"> El usuario o la contraseña son incorrectos. </span>
<?php endif; ?>
Bien, con esto ya tenemos nuestro login, en la página principal.
Ahora vamos a editar nuestro archivo usuario.php con el siguiente código:
<?php
session_start();
if(isset($_SESSION['logueado']) and $_SESSION['logueado']){
$nombre = $_SESSION['nombre'];
}else{
//Si el usuario no está logueado redireccionamos al login.
header('Location: index.php');
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> Página de bienvenida </title>
</head>
<body>
<h1> Bienvenido/a <?php echo $nombre; ?> </h1>
<p> <a href="cerrar_sesion.php"> Cerrar sesión </a> </p>
</body>
</html>
Aquí simplemente mostramos un mensaje saludando al usuario, que se ha logueado:
<h1> Bienvenido/a <?php echo $nombre; ?> </h1>
Y también un link para cerrar sesión:
<p> <a href="cerrar_sesion.php"> Cerrar sesión </a> </p>
En la cabecera vamos a comprobar también que para ingresar a esta página el usuario se haya logueado previamente.
if(isset($_SESSION['logueado']) and $_SESSION['logueado']){
$nombre = $_SESSION['nombre'];
}else{
//Si el usuario no está logueado redireccionamos al login.
header('Location: index.php');
exit;
}
Si el usuario está logueado guardamos el nombre en una variable $nombre para luego saludarlo, pero de no ser así, lo redireccionamos a la página principal, ya que no está autorizado a ver esa página.
Y finalmente editamos el código de cerrar_sesion.php:
<?php
session_start();
if (isset($_SESSION['logueado']) and $_SESSION['logueado']) {
$_SESSION['logueado'] = false;
unset($_SESSION['nombre']);
}
header('Location: index.php');
exit;
?>
Aquí simplemente preguntamos si el usuario está logueado, lo deslogueamos seteando la variable ‘logueado’ a false y eliminando el nombre de memoria:
$_SESSION['logueado'] = false; unset($_SESSION['nombre']);
Bueno, con esto terminamos el trabajo de cookies y sesiones.
Saludos!
Anterior: Aprendiendo PHP, parte 20: Cookies
Siguiente: Aprendiendo PHP, parte 22: Introducción a MySQL, tablas

gracias por l informacion de seguro debes ser un gran profesional, saludos amigo y sigue asi ……
Gracias a vos por pasarte.
Saludos!
como hago para conectar una BD de Mysql para que me gestione los usuarios?
Eso, está en los capítulos de más adelante, hay varios donde explica cómo conectar y hacer consultas.
Saludos!
Muchas gracias, explicas genial, saludos.
Muchas gracias, Viany.
Saludos!