🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PHP y MySQL
  3. Gestionar las sesiones
Extrait - PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición)
Extractos del libro
PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición) Volver a la página de compra del libro

Gestionar las sesiones

Descripción del problema

El protocolo HTTP (HyperText Transfer Protocol) es un protocolo «sin estado»: nada permite identificar que es el mismo usuario quien estaba anteriormente en la página A y que ahora accede a la página B.

En cuanto a PHP, veíamos que el alcance de una variable es el script en el que está definida y esta existe solo durante la ejecución del script.

Ahora bien, un sitio web interactivo que va más allá de la simple visualización de una serie de páginas necesita a menudo, desde el punto de vista de la lógica aplicativa, identificar a un usuario de una página a otra y conservar datos relativos a dicho usuario de una página a otra (un caso típico sería el carro de la compra de un usuario en una página y que debe permanecer definido en la página prevista para el pago).

El término «sesión» designa el período de tiempo correspondiente a la navegación continua de un usuario en un sitio web. «Gestionar las sesiones» consiste, por lo tanto, en estar en condiciones de identificar el momento en el que un nuevo usuario accede a una página del sitio web y conservar información relativa a este usuario hasta que abandona dicho sitio web. El usuario no es forzosamente un usuario autenticado por un nombre y una contraseña, sino que puede ser perfectamente un «anónimo»...

Autenticación

1. Visión de conjunto

Algunos sitios web necesitan autenticar a los usuarios que acceden a ellos para comprobar que están bien inscritos.

Esta autenticación incluye normalmente dos etapas:

  • introducción de datos identificativos por parte del usuario, típicamente un nombre y una contraseña;

  • comprobación de que la identificación introducida corresponde realmente con un usuario inscrito.

2. Entrada de la identificación

La identificación puede introducirse de dos maneras:

  • por mediación de un formulario previsto para ello;

  • mediante las funciones de autenticación HTTP.

a. Identificación por formulario

Es muy sencillo crear un pequeño formulario que permita al usuario introducir un nombre y una contraseña.

Ejemplo de script PHP (login.php) que muestra este formulario (función de comprobación de momento no definida)

<?php 
// Inclusión del archivo que contiene las funciones generales. 
include('funciones.inc.php') ; 
// Función que comprueba que la identificación introducida 
// es correcta. 
function usuario_existe($identificador,$contrasenia) { 
   // Aleatorio, esperando completar... 
   return (bool) rand(0,1); 
} 
// Definición de las variables. 
$identificador = ''; 
$contrasenia = ''; 
$mensaje = ''; 
//Procesamiento del formulario. 
if (isset($_POST['conexión'])) { 
   // Recuperar los datos introducidos. 
   $identificador = $_POST['identificador']; 
   $contrasenia = $_POST['contraseña']; 
   // Comprobar que el usuario existe. 
   if (usuario_existe($identificador,$contrasenia)) { 
      // El usuario existe... 
   // Salir a otra página e interrumpir 
   // el script. 
   header('location: inicio.php'); 
   exit; 
   } else { 
   // El usuario no existe... 
   // Mostrar un mensaje y ofrecer 
   // de nuevo la identificación 
   $mensaje = 'Identificación incorrecta. '; ...

Utilizar cookies

1. Idea general

Una cookie es un pequeño archivo almacenado por un sitio web en el equipo del usuario que puede contener información. Las cookies son automáticamente enviadas al servidor web por el explorador cuando el usuario navega en las páginas del sitio en cuestión.

PHP permite recuperar muy fácilmente, en variables, los datos almacenados en la cookie. 

La función setcookie permite guardar una cookie en el sistema del cliente.

Sintaxis

booleano setcookie(cadena nombre [, cadena valor [, entero  
caducidad [, cadena ruta [, cadena dominio [, booleano  
segura[, booleano http_únicamente]]]]]]) 
buleano setcookie(cadena nombre [, cadena valor [, tabla opciones]]) 

nombre

Nombre de la cookie.

valor

Valor almacenado en la cookie.

caducidad

Fecha de caducidad de la cookie (timestamp Unix).

ruta

Ruta del directorio en el servidor en el que la cookie está disponible. Poner / para que la cookie esté disponible en el dominio entero o /dir/ para que esté disponible en el directorio /dir/ del dominio y todos sus subdirectorios. De manera predeterminada, igual al directorio desde el que la cookie ha sido guardada.

dominio

Dominio al que se envía la cookie. .miSitio (con un punto al principio) permite, por ejemplo, hacer que la cookie esté disponible para todos los subdominios de miSitio.com.

segura

Poner TRUE para indicar que la cookie solo debe ser enviada a una conexión segura (FALSE, de manera predeterminada).

http_únicamente

Poner TRUE para indicar que la cookie solo debe ser enviada para el protocolo HTTP (FALSE, de manera predeterminada).

opciones

Tabla asociativa utilizada para definir las opciones de la cookie sustituyendo los argumentos. Las claves posibles son expires, path, domain, secure, httponly y samesite. Para las cinco primeras claves, los valores son los mismos que los valores de los argumentos expiracion, rutadominio, seguridad y http_solo; para la clave samesite, los valores posibles son Strict (cookie enviada al mismo sitio únicamente), Lax (cookie que también se envía para consultas de tipo GET) o None (ninguna restricción). 

Si la función solo se invoca con el parámetro nombre, la cookie que lleva este nombre se elimina del equipo del usuario. Si los parámetros dominio y ruta hubieran sido establecidos al guardar la cookie, hay que especificarlos...

Utilizar la gestión de las sesiones de PHP

1. Principios

PHP ofrece un conjunto de funciones que facilitan la gestión de las sesiones. Los principios básicos son los siguientes:

  • Un identificador único es automáticamente atribuido a cada sesión.

  • Este identificador único es transmitido de una página a otra, bien mediante cookies (si el sistema acepta las cookies), bien por dirección URL en caso contrario; en cualquier caso, es PHP el que elige automáticamente el método adecuado y garantiza esta transferencia (con alguna reserva ligada a la configuración).

  • Los datos cuyo valor se desea conservar de una página a otra durante la sesión se indican a PHP, quien se encarga automáticamente de restituir dicho valor al principio del script y de guardarlo al final del script.

En resumen, PHP se encarga de toda la gestión.

2. Aplicación

Las principales funciones del módulo de gestión de las sesiones son las siguientes:

Nombre

Cometido

session_start

Abre una nueva sesión o reactiva la sesión actual.

session_id

Devuelve (o, si es necesario, modifica) el identificador de la sesión.

session_name

Devuelve (o, si es necesario, modifica) el nombre de la variable utilizada para almacenar el identificador de la sesión.

session_abort

Anula las modificaciones añadidas a los datos de sesión y termina la sesión.

session_reset

Reinicializa los datos de sesión a los valores iniciales.

session_destroy

Elimina la sesión.

session_status

Devuelve el estado actual de una sesión.

De forma adicional, se puede operar muy fácilmente con los datos de sesión a través de la tabla $_SESSION.

session_start

Sintaxis

booleano session_start([tabla opciones]) 

opciones

Tabla asociativa que permite definir las opciones que van a sustituir a las directivas de configuración relativas a las sesiones (las claves son iguales a los nombres de las directivas sin el prefijo session).

La función session_start consulta al entorno para detectar si una sesión ha sido ya abierta para el usuario actual. En caso afirmativo, los datos guardados en la sesión se restablecen. Si no, se abre una nueva sesión con la atribución de un identificador.

La función session_start devuelve TRUE si la sesión se ha podido crear con éxito y FALSE en caso contrario....

Conservar información de una visita a otra

Si se desea poder conservar información sobre un usuario de una visita a otra (posiblemente muy alejadas en el tiempo), existen dos soluciones principales:

  • almacenar una cookie en su equipo (preferentemente, con su acuerdo previo);

  • guardar la información en el lado del servidor (lo más práctico sería utilizar una base de datos), y asociar esta información a una identificación (típicamente, un nombre y una contraseña) que el usuario deberá introducir en cada visita.

Una solución intermedia, elegante y respetuosa de cara al usuario es la que utilizan algunos sitios web; esta solución consiste en proponer al usuario almacenar en su equipo una cookie que solo contiene uno o dos datos que permiten la conexión automática al sitio (sin introducir nombre y contraseña), guardando la información complementaria en una base de datos.

Ilustraremos esta solución mediante dos páginas:

  • una página de personalización (script personalizar.php) que permite al usuario activar o desactivar la conexión automática;

  • una página de identificación (script login.php) que, según el caso, efectúa la conexión automática o solicita al usuario que se conecte.

Cada conexión del usuario es una sesión.

Código fuente

  • Script personalizar.php:

<?php 
// Inclusión del archivo que contiene las funciones generales. 
include('funciones.inc.php') ; 
// Abrir/reactivar la sesión. 
session_start(); 
// Definición de las variables. 
$mensaje = ''; 
// ¿Se ha abierto la sesión a nivel de aplicación? 
if (isset($_SESSION['identificador'])) { // sí 
  // Recuperar todos los datos de sesión. 
  $identificador = $_SESSION['identificador']; 
  $contrasenia = $_SESSION['contrasenia']; 
  // ¿El script es invocado en el proceso del formulario? 
  if (isset($_POST['activar'])) { // sí 
    // Activar la conexión automática. 
    // Almacenar dos cookies de una duración de 30 días, 
    // una para el identificador del usuario 
   ...

Conclusiones sobre las variables GPCS (Get/Post/Cookie/Session)

Desde el principio de este libro, hemos encontrado variables «particulares», las asociadas a datos de formulario, a datos enviados por una dirección URL, a datos de una cookie y a datos de sesiones.

Estos diferentes tipos de variables se designan bajo la denominación de variables GPCS (Get/Post/Cookie/Session).

Hemos visto que estas variables funcionaban según el mismo principio: puede accederse a ellas por mediación de las tablas asociativas $_GET, $_POST, $_COOKIE y $_SESSION. Además, la tabla asociativa $_REQUEST agrupa el contenido de las tablas $_GET, $_POST y $_COOKIE.

La tabla $_REQUEST debe utilizarse con precaución, ya que contiene datos proporcionados al script mediante diferentes mecanismos; no se puede estar seguro, por lo tanto, de que la información leída llega realmente por el medio esperado.

El hecho de que se creen las tablas $_GET, $_POST y $_COOKIE depende de la directiva de configuración variables_order.

Esta directiva es una cadena compuesta por los caracteres G, P y C, que corresponden a los tipos ya evocados, y a dos caracteres: E, que corresponde a las variables de entorno y S, correspondiente a las variables del servidor http. Por defecto, la directiva variables_order es igual a EGPCS.

Las variables de entorno del sistema operativo y las variables del servidor HTTP están disponibles en el entorno...