En esta lección se trata el manejo de sesiones en PHP:
Las sesiones son un mecanismo que utilizan los servidores web para guardar información sobre el usuario y su actividad y recuperarla cada vez que el navegador les pide una página.
Esta información esta disponible como mucho hasta que el usuario cierre el navegador.
La diferencia con respecto a las cookies es que mediante cookies la información se guarda en el ordenador del usuario y se envía en cada petición al servidor, mientras que mediante sesiones la información se guarda en el servidor. En el manual de PHP se ofrece un capítulo dedicado a las sesiones.
El trabajo con sesiones tiene tres partes:
Cuando alguna página crea una sesión utilizando la función correspondiente, el servidor asocia al navegador del usuario un identificador de usuario único. El identificador se guarda en el usuario en forma de cookie o, si no se permite la creación de cookie, añadiendo el identificador en la dirección de la página.
Una vez creada la sesión, las páginas solicitadas por el mismo navegador pueden guardar y recuperar información en el servidor, información que se asocia al identificador de usuario, por lo que no es accesible a otros. La información se conserva hasta que el usuario o el servidor destruyan la sesión.
Tanto el usuario como el servidor pueden cerrar la sesión. El usuario puede destruir la sesión cerrando el navegador. El servidor puede destruir la sesión cuando alguna página utilice la función correspondiente.
En PHP, las sesiones se crean mediante la función session_start(). Si la sesión no existía, esta función crea la sesión y le asocia un identificador de sesión único. Si la sesión ya existía, esta función permite que la página tenga acceso a la información vinculada a la sesión.
Por ejemplo:
<?php session_start(); ?>
Como en el caso de las cookies, hay que tener la precaución de utilizar la función session_start() antes de empezar a escribir el contenido de la página, porque si no PHP producirá un aviso y no se creará la sesión. El motivo es que el idetificador de sesión se utiliza en las cabeceras de respuesta HTTP y las cabeceras se envían antes del texto de la página. Es decir, cuando PHP encuentra una instrucción que escribe texto, cierra automáticamente la cabecera; si a continuación PHP encuentra en el programa la función session_start(), da un aviso porque ya se han enviado las cabeceras y no se crea la sesión.
El ejemplo siguiente muestra código incorrecto, ya que utiliza la función setcookie() después de haber escrito texto, y el mensaje de aviso generado por PHP.
<?php // Este código es incorrecto, la cabecera se crea después de crear texto print "<p>Hola</p>"; session_start(); ?> |
<p>Hola</p>
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at prueba.php:3) in prueba.php on line 5 |
Nota: En algunos casos este código incorrecto puede no generar un aviso y la cookie puede crearse, dependiendo de la configuración de la directiva output_buffering.
Volver al principio de la página
Cuando una página ha creado una sesión o ha accedido a una sesión ya existente mediante session_start(), la página tiene acceso a la matriz $_SESSION que contiene las variables de esa sesión.
La matriz $_SESSION es una matriz asociativa en la que se pueden definir valores como en cualquier otra matriz. La diferencia es que $_SESSION es accesible desde páginas diferentes (siempre que esas páginas tengan asociada la misma sesión), manteniéndose los valores de una página a otra.
El ejemplo siguiente muestra dos páginas. La primera página guarda información en $_SESSION y la segunda la utiliza.
<?php session_start(); $_SESSION["nombre"] = "Pepito Conejo"; print "<p>Se ha guardado su nombre.</p>"; ?> |
<p>Se ha guardado su nombre.</p> |
<?php session_start(); print "<p>Su nombre es $_SESSION[nombre].</p>"; ?> |
<p>Su nombre es Pepito Conejo.</p> |
Los nombres de los índices de la matriz $_SESSION tienen que cumplir las mismas reglas que los nombres de las variables, es decir, que el primer carácter debe ser una letra o un guión bajo (_).
Los valores de $_SESSION se borran como en cualquier otra matriz mediante la función unset().
<?php
session_start();
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
unset($_SESSION["nombre"]);
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
?>
|
<p>Su nombre es Pepito Conejo.</p>
<p>No sé su nombre.</p> |
Un detalle importante que distingue a las sesiones de las cookies es que:
Es decir, que el siguiente programa siempre producirá el mismo resultado:
<?php
session_start();
$_SESSION["nombre"] = "Pepito Conejo";
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
unset($_SESSION["nombre"]);
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
?>
|
<p>Su nombre es Pepito Conejo.</p>
<p>No sé su nombre.</p> |
Volver al principio de la página
El usuario puede destruir la sesión cerrando el navegador, pero las sesiones también se pueden destruir por programa mediante la función session_destroy().
Cuando se destruye una sesión, el programa que ha destruido la sesión sigue teniendo acceso a los valores de $_SESSION creados antes de la destrucción de la sesión, pero las páginas siguientes no. Si se ejecuta el primero de los ejemplos siguientes y después el segundo, se obtienen los resultados indicados:
<?php
session_start();
$_SESSION["nombre"] = "Pepito Conejo";
session_destroy();
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
?>
|
<p>Su nombre es Pepito Conejo.</p> |
<?php
session_start();
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>";
} else {
print "<p>No sé su nombre.</p>";
}
?>
|
<p>No sé su nombre.</p> |
Volver al principio de la página
Esta página forma parte del curso "Páginas web con PHP" disponible en http://www.mclibre.org
Esta obra está bajo una licencia de Creative
Commons Reconocimiento-CompartirIgual 3.0 España.