¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PHP 7
  3. Administrar las sesiones
Extrait - PHP 7 Desarrollar un sitio web dinámico e interactivo (2ª edición)
Extractos del libro
PHP 7 Desarrollar un sitio web dinámico e interactivo (2ª edición) Volver a la página de compra del libro

Administrar las sesiones

Descripción del problema

El protocolo HTTP (HyperText Transfer Protocol) es un protocolo "sin estado". Es decir, no hay nada que permita identificar que el mismo usuario que ha estado previamente en la página A ahora está accediendo a la página B.

En cuanto a PHP, ahora sabemos que una variable tiene un ámbito de aplicación igual al script en el que está definida y que existe solo durante el tiempo de ejecución del script.

Sin embargo, un sitio interactivo que no se limita a mostrar las páginas una tras otra a menudo necesita el punto de vista de la lógica de aplicación para identificar a un usuario de una página a otra y mantener información relativa a este usuario de una página a otra (por lo general, un carro de la compra realizada por el usuario en una página siempre debe estar definido en la página de pago).

El término "sesión" designa el período de tiempo correspondiente a la navegación continua de un usuario en un sitio. "Administrar las sesiones" significa, por lo tanto, ser capaz de identificar el momento en que un nuevo usuario accede a una página del sitio y conservar la información relativa a ese usuario hasta que sale del sitio. El usuario no tiene por qué ser un usuario autenticado por medio de un nombre y una contraseña; puede ser perfectamente un usuario "anónimo"...

Autenticación

1. Información general

Algunos sitios necesitan autenticar a los usuarios que acceden a él para comprobar si están registrados.

Esta autenticación normalmente consta de dos pasos:

  • Introducción de las credenciales de usuario, por lo general un nombre y una contraseña.

  • Verificación de que las credenciales introducidas corresponden a un usuario registrado.

2. Introducción de las credenciales de identificación

Las credenciales de identificación se pueden introducir de dos formas:

  • A través de un formulario previsto a tal efecto.

  • A través de 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 verificación de que el usuario existe, por el momento sin definir)

<?php 
// Inclusión del archivo que contiene las funciones generales. 
include('funciones.inc'); 
// Función que verifica que las credenciales de identificación  
// introducidas son correctas. 
function usuario_existe($identificador,$contraseña) { 
  // Aleatoria, esperando algo mejor... 
  return (bool) rand(0,1); 
} 
// Inicialización de las variables. 
$identificador = ''; 
$contraseña = ''; 
$mensaje = ''; 
// Procesamiento del formulario. 
if (isset($_POST['conexión'])) { 
  // Recuperar la información introducida. 
  $identificador = $_POST['identificador']; 
  $contraseña = $_POST['contraseña']; 
  // Verificar que el usuario existe. 
  if (usuario_existe($identificador,$contraseña)) { 
     // El usuario existe... 
     // Ir a otra página y detener  
     // el script. 
     header('location: inicio.php'); 
     exit; 
  } else { 
     // El usuario no existe... 
     // Mostrar un mensaje y proponer de  
     // nuevo la identificación. 
     $mensaje...

Utilizar cookies

1. Principio

Una cookie es un pequeño archivo depositado por un sitio en el equipo del usuario que puede contener información.

Las cookies se reenvían automáticamente al servidor web por el navegador cuando el usuario navega por las páginas del sitio.

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

La función setcookie permite depositar una cookie en el equipo del usuario.

Sintaxis

booleano setcookie(cadena nombre [, cadena valor [, entero vencimiento [, 
cadena ruta [, cadena dominio [, booleano asegurado[, 
booleano http_únicamente]]]]]]) 

Con

nombre

Nombre de la cookie.

valor

Valor almacenado en la cookie.

vencimiento

Fecha de caducidad de la cookie (timestamp Unix).

ruta

Ruta de acceso en el servidor donde está disponible la cookie. Colocar / para hacer que la cookie esté disponible en todo el dominio o /rep/ para que la cookie esté disponible en el directorio /rep/ del dominio y todos sus subdirectorios. De forma predeterminada, igual al directorio desde donde se envió la cookie.

dominio

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

asegurado

Incluir TRUE para indicar que la cookie debe transmitirse únicamente en una conexión segura (FALSE por defecto).

http_únicamente

Incluir TRUE para indicar que la cookie debe transmitirse únicamente por el protocolo HTTP (FALSE por defecto).

Si la función solo se llama con el parámetro nombre, la cookie que lleva este nombre se elimina del equipo del usuario. Si los parámetros dominio y ruta se han especificado durante el envío de la cookie, debe especificarlos de manera idéntica para eliminar la cookie (poner fecha de caducidad en el pasado).

Si se especifica el parámetro valor, se envía una cookie con el nombre nombre que contiene el valor valor al equipo del usuario; si ya existe una cookie con este nombre, esta última se actualiza con el nuevo valor.

El parámetro vencimiento permite determinar la fecha de vencimiento de la cookie (y por lo tanto la fecha de su eliminación del equipo del usuario); si este parámetro no se especifica (o es igual a 0), la cookie expira al final de la sesión, es decir, cuando...

Utilizar la gestión de sesiones de PHP

1. Principios

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

  • Un identificador único se asigna automáticamente a cada sesión.

  • Este identificador único se transmite de una página a otra, bien mediante una cookie (si el equipo acepta cookies) o a través de la URL, en caso contrario; en cualquier caso, es PHP quien elige automáticamente el enfoque correcto y garantiza esta transferencia (con algunas reservas en relación con la configuración).

  • Los datos cuyo valor desea conservar de una página a otra mientras dure la sesión se indican a PHP, que se encarga automáticamente de devolver los valores al comienzo del script y guardarlos al final de este.

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

2. Implementación

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

Nombre

Función

session_start

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

session_id

Devuelve (o modifica) el identificador de la sesión.

session_name

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

session_abort

Anula las modificaciones efectuadas en los datos de sesión y termina la sesión.

session_reset

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

session_destroy

Elimina la sesión.

session_status

Devuelve el estado actual de una sesión.

Además, la matriz $_SESSION permite manipular muy fácilmente los datos de sesión.

session_start

Sintaxis

booleano session_start([matriz options]) 

opciones

Matriz asociativa que permite definir las opciones que reemplazarán a las directivas de configuración relativas a las sesiones. Este parámetro opcional es una novedad de la versión 7.

La función session_start pregutará al entorno para detectar si el usuario actual ya ha iniciado una sesión. En caso afirmativo, las variables almacenadas en la sesión se restituyen. De lo contrario, se abre una nueva sesión con la asignación de un identificador.

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

Cualquier script que participe en la gestión de sesiones...

Conservar la información de una visita a otra

Si desea conservar la información sobre un usuario de una visita a otra (posiblemente muy distantes en el tiempo), hay dos soluciones predominantes:

  • Depositar una cookie en su equipo (si es posible con su previo consentimiento).

  • Almacenar la información del lado del servidor (la opción más práctica es utilizar una base de datos) y asociar esa información con una identificación (por lo general, un nombre y una contraseña) que el usuario debe introducir en cada visita.

Algunos sitios utilizan una solución intermedia, elegante y fácil de usar; esta solución consiste en ofrecer al usuario depositar en su ordenador una cookie que contiene solo uno o dos datos que permiten el acceso automático al sitio (sin introducir un nombre ni una contraseña); la información adicional se recupera en una base de datos.

Vamos a ilustrar esta solución con la ayuda de 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 de forma automática o pide al usuario que se conecte.

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

Fuente

  • Script personalizar.php:

<?php 
// Inclusión del archivo que contiene las funciones generales. 
include('funciones.inc'); 
// Abrir/reactivar la sesión. 
session_start(); 
// Inicialización de las variables. 
$mensaje = ''; 
// ¿La sesión se ha iniciado al nivel de la aplicación? 
if (isset($_SESSION['identificador'])) { // sí 
  // Recuperar la información de sesión. 
  $identificador = $_SESSION['identificador']; 
  $contraseña = $_SESSION['contraseña']; 
  // ¿Se llama al script en el procesamiento del formulario? 
  if (isset($_POST['activar'])) { // sí 
    // Activar la conexión automática. 
    // Depositar dos cookies de un tiempo de vida de 30 días, 
    // una para el identificador del usuario y una para su  
   ...

Breve resumen de las variables Get/Post/Cookie/Session

Desde el comienzo de este libro, nos hemos encontrado con variables "especiales", relacionadas con datos del formulario, con datos transmitidos a través de una URL, con datos de una cookie o con datos de sesiones.

Hemos visto que estas variables funcionan bajo el mismo principio: son accesibles por medio de matrices asociativas $_GET, $_POST, $_COOKIE y $_SESSION. Además, la matriz asociativa $_REQUEST reagrupa el contenido de las matrices $_GET, $_POST y $_COOKIE.

La matriz $_REQUEST debe utilizarse con precaución, ya que contiene información proporcionada al script a través de varios mecanismos; no estamos necesariamente seguros de que la información leída llega por los medios esperados.

El hecho de que las matrices $_GET, $_POST y $_COOKIE se creen realmente 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 mencionados, y de otros dos caracteres: E, correspondiente a las variables de entorno, y S, correspondiente a las variables del servidor HTTP. De forma predeterminada, 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 PHP a través de las matrices asociativas $_ENV y $_SERVER.

El orden en el que las variables Get, Post y Cookie...