informaticaPC

Tutorial de PHP

Sesiones en PHP

Sesiones y variables de sesión

Al crear una variable en PHP ésta se encontrará disponible durante la ejecución de la página contenida en un archivo .php, eliminándose automaticamente una vez finalizado el script.

Sin embargo, en ocasiones necesitaremos que determinada información esté disponible en diferentes páginas en PHP y en posteriores accesos a las mismas: para ello podemos usar variables de sesión.

Iniciar y eliminar una sesión en PHP

Para crear una variable de sesión en primer lugar deberemos iniciar una sesión en PHP.

Para Iniciar, identificar y eliminar sesiones usaremos las siguientes funciones de PHP:

  • session_start(): se coloca al principio de cada archivo .php (incluso antes de las funciones include() o require()) para iniciar o reanudar la sesión. Devuelve true si la sesión se ha iniciado correctamente o false en caso contrario (en versiones anteriores a PHP 5.3.0 se devolvía true).

    Podemos configurar PHP para que lasesión se inicie o continúe automáticamente al principio de cada página de las siguientes formas:

    • En el archivo de configuración de PHP (php.ini) localiza la línea session.auto_start = 0 y sustitúyela para que quede del siguiente modo: session.auto_start = 1 (y después reinicia el servidor web).
    • Otra forma es definiendo dicho valor en tiempo de ejecución mediante la función ini_set(): para ello escribiremos al principio del código PHP la siguiente línea: ini_set('session.auto_start', 1); pero ten en cuenta que las configuraciones de PHP modificadas con dicha función se restaurarán al finalizar el script PHP mismo.

    Si usamos dicho método no deberemos poner session_start().

  • session_id(): asigna un identificador a una sesión (se recomienda que sea corto y que contenga sólo caracteres alfanuméricos). Si no asignamos un identificador, se asignará uno automáticamente.

    En caso de ser usada, debe estar antes de session_start().

  • session_name(): asigna un nombre a una sesión (se recomienda que sea corto y que contenga sólo caracteres alfanuméricos). Si no indicamos un nombre, se usará por defecto el definido en el archivo de configuración de PHP (por defecto es PHPSESSID).

    IMPORTANTE: en caso de usarse deberá estar definida en cada archivo .php, y situada antes de session_start().

  • session_destroy(): elimina la información de la sesión actual, pero sin eliminar las variables ni las Cookies de sesión (el código para borrar dicha información deberá ir justo antes de llamar a esta función).

    Devuelve true si se ha eliminado la sesión o false en caso de error.

Los pasos a seguir para crear y finalizar una sesión en PHP son:

<?php
    session_id();       // Uso no imprescindible. Si se usa debe estar antes de 'session_start()'
    session_start();    // Iniciar la sesión
    ...
    session_unset();    // Borrar las variables de sesión
    setcookie(session_name(), 0, 1 , ini_get("session.cookie_path"));	// Eliminar la cookie
    session_destroy();  // Destruir la sesión
?>

Observa que como primer parámetro de la función setcookie() (usada para crear una cookie) indicamos el nombre de la sesión, y como cuarto parámetro usamos ini_get() para obtener el directorio en el que se almacenan las cookies (dicha información se encuentra en el archivo de configuración de PHP php.ini).

Información

Con la configuración por defecto de PHP las sesiones finalizan al cerrar el navegador web.

Información

Las versiones de PHP 5.3.0 y anteriores están configuradas por defecto para propagar datos de la sesión (nombre e identificador, entre otros) usando cookies (pequeños archivos de que se guardan en el navegador web del usuario, con lo cual éste deberá tenerlas activadas): con dicha configuración la función session_start() debe ser ejecutada antes de enviar cualquier información al navegador web.

Información

Es posible usar sesiones en PHP sin cookies, pero dado que de tal forma se tendría que pasar el identificador de la sesión entre las distintas URL's ocasiona problemas de seguridad (por ejemplo, si un usuario pasa a otro un enlace en el que aparezca dicho SID)... si bien ninguno de los métodos es seguro al 100%.

Más información

Vea también: [ session_start() ] - [ session_id() ] - [ session_name() ] - [ session_destroy() ] - [ ini_set() ] - [ setcookie() ] - [ ini_get() ]

Crear y eliminar variables y arrays de sesión

Para crear una variable o array de sesión en PHP usaremos el array asociativo $_SESSION del siguiente modo:

Si deseamos eliminar una variable de sesión disponemos de la función de PHP unset(). Si lo que deseamos es eliminar todas las variables de sesión usaremos session_unset().

<?php
    // Iniciar la sesión
    session_start();

    // Variables de sesión:
    $_SESSION['sesion_iniciada'] = true;
    $_SESSION['nombre'] = "PEDRO";

    // Variable de sesión en array:
    $_SESSION['aDatos'] = array();
    $_SESSION['aDatos']['nombre'] = "MARTA";

    echo "Nombre: ".$_SESSION['nombre']."<br />";
    echo "Nombre (en array): ".$_SESSION['aDatos']['nombre']."<p />";

    // Borrar el contenido de las variables y arrays de sesión:
    session_unset();
    //$_SESSION = array();      // También podemos hacerlo así:

    echo "<p>Variables y arrays de la sesión borrados</p>";

    if( isset($_SESSION['nombre']) == false )
    echo "Nombre no definido.<br />";

    if( isset($_SESSION['aDatos']['nombre']) == false )
        echo "Nombre (en array) no definido";
?>

Descargar ejemplo

Variables y arrays de sesión

Información

Hasta ahora se usaba también la función session_register() para registrar variables en la sesión actual, pero desde la versión de PHP 5.3.0 ha quedado obsoleta, por lo que no debe continuar usándose.

Información

Cuando se usa $_SESSION no se deben usar las funciones de PHP session_register(), session_is_registered() ni session_unregister().

Más información

Vea también: [ $_SESSION ] - [ unset() ] - [ session_unset() ]

Ejemplo de sesión en PHP

A continuación te mostramos un ejemplo más completo para que comprendas mejor cómo manejar sesiones en PHP:

02_sesion1.php:

<?php
    // Si se usa debe contener (sólo caracteres alfanuméricos) e ir antes de session_start():
    session_id("identificadorDeSesion");

    // Iniciar la sesión
    session_start();

    // Variables de sesión:
    $_SESSION['sesion_iniciada'] = true;
    $_SESSION['nombre'] = "PEDRO";
    $_SESSION['edad'] = 33;

    // Array de sesión:
    $_SESSION['aDatos'] = array();
    $_SESSION['aDatos']['nombre'] = "MARTA";
    $_SESSION['aDatos']['edad'] = 37;

    echo "PÁGINA PRINCIPAL<br />";
    echo "================<p />";

    // Mostrar información de la sesión:
    echo "Identificador de la sesión: [".session_id()."]<br/>";
    echo "Nombre de la sesión: [".session_name()."]<p/>";

    // Mostrar valores de las variables de sesión creadas:
    echo "Nombre: ".$_SESSION['nombre']."<br />";
    echo "Edad: ".$_SESSION['edad']."<p />";

    // Mostrar valores en el array de sesión creado:
    echo "Nombre (en array): ".$_SESSION['aDatos']['nombre']."<br />";
    echo "Edad (en array): ".$_SESSION['aDatos']['edad']."<p />";

    echo "<a href='02_sesion2.php'>Comprobar los valores en otra página</a><br/>";
    echo "<a href='02_sesion3.php'>Finalizar la sesión</a>";
?>

02_sesion2.php:

<?php
    session_start();  // Continuar la sesión

    if( isset($_SESSION['sesion_iniciada']) == true )
    {
        echo "COMPROBAR LOS VALORES<br />";
        echo "=======================<p />";

        print_r( $_SESSION );

        echo "<p />";
        echo "Identificador de la sesión: [".session_id()."]<br/>";
        echo "Nombre de la sesión: [".session_name()."]<p/>";

        echo "<p/>";

        echo "Nombre: ".$_SESSION['nombre']."<br/>";
        echo "Edad: ".$_SESSION['edad']."<p/>";

        echo "Nombre (en array): ".$_SESSION['aDatos']['nombre']."<br/>";
        echo "Edad (en array): ".$_SESSION['aDatos']['edad']."<p/>";
    }
    else
    {
        echo "<p>No has pasado por la página principal</p>";
    }

    echo "<a href='02_sesion1.php'>Volver a la página principal</a>";
?>

02_sesion3.php:

<?php
    session_start();  // Continuar la sesión

    if( isset($_SESSION['sesion_iniciada']) == true )
    {
        echo "FINALIZAR LA SESIÓN<br />";
        echo "==================<p />";

        echo "<p />";
        echo "Identificador de la sesión: [".session_id()."]<br/>";
        echo "Nombre de la sesión: [".session_name()."]<p/>";

        session_unset();                                        // Borrar las variables de sesión
        setcookie(session_name(), 0, 1 , ini_get("session.cookie_path"));	// Eliminar la cookie
        session_destroy();                                      // Destruye el resto de información sobre la sesión

        // Comprobar la variable de sesión 'nombre':
        if( isset($_SESSION['nombre']) )
            echo "Ahora el nombre es: ".$_SESSION['nombre']."<br />";
        else
            echo "La variable de sesión 'nombre' no está definida.<br />";

        // Comprobar la variable de sesión 'edad':
        if( isset($_SESSION['edad']) )
            echo "Ahora la edad es: ".$_SESSION['edad']."<br />";
        else
            echo "La variable de sesión 'edad' no está definida.<br />";

        // Comprobar el array de sesión 'aDatos':
        if( isset($_SESSION['aDatos']) )
        {
            echo "Ahora el nombre (en array) es: ".$_SESSION['aDatos']['nombre']."<br/>";
            echo "Ahora la edad (en array) es: ".$_SESSION['aDatos']['edad']."<br/>";
        }
        else
            echo "La array de sesión 'aDatos' no está definido.";

        echo "<p>SESIÓN FINALIZADA CORRECTAMENTE</p>";
    }
    else
    {
        echo "<p>No has pasado por la página principal</p>";
    }

    echo "<a href='02_sesion2.php'>Comprobar los valores en otra página (no se mostrará nada por haber finalizado la sesión)</a><br/>";
    echo "<a href='02_sesion1.php'>Volver a la página principal</a>";
?>

Descargar ejemplo

Propagar objetos en una sesión de PHP

También es posible propagar Objetos en una sesión teniendo en cuenta que deberemos incluir la definición del mismo en cada una de las páginas (o bien en un archivo accesible desde todas ellas).

Persona.php (definición de una Clase en PHP):

<?php
    class Persona
    {
        public $nombre    = null;
        public $apellidos = null;

        function Persona()
        {
        }

        function getNombre() {
            return $this->nombre;
        }

        function setNombre( $nombre ) {
            $this->nombre = $nombre;
        }

        function getApellidos() {
            return $this->apellidos;
        }

        function setApellidos( $apellidos ) {
            $this->apellidos = $apellidos;
        }
    }
?>

03_sesion1.php:

<?php
    require_once("Persona.php");

    // Iniciar la sesión
    session_start();

    // Crear una instancia del objeto:
    $objPersona = new Persona();
    $objPersona->setNombre("MARTINA");
    $objPersona->setApellidos("MARRERO MEDINA");

    // Variables de sesión:
    $_SESSION['usuario'] = $objPersona;

    echo "PÁGINA PRINCIPAL<br />";
    echo "================<p />";

    // Mostrar información del objeto en la sesión:
    echo "Nombre: [".$_SESSION['usuario']->getNombre()."]<br/>";
    echo "Apellidos: [".$_SESSION['usuario']->getApellidos()."]<p/>";

    echo "<a href='03_sesion2.php'>Ir a la otra página</a><br/>";
?>

03_sesion2.php:

<?php
    require_once("Persona.php");

    session_start();  // Continuar la sesión

    if( isset($_SESSION['usuario']) == true )
    {
        echo "COMPROBAR LOS VALORES<br />";
        echo "=======================<p />";

        print_r( $_SESSION );

        echo "<p />";

        // Mostrar información del objeto en la sesión:
        echo "Nombre: [".$_SESSION['usuario']->getNombre()."]<br/>";
        echo "Apellidos: [".$_SESSION['usuario']->getApellidos()."]<p/>";
    }
    else
    {
        echo "<p>No has pasado por la página principal</p>";
    }

    echo "<a href='03_sesion1.php'>Volver a la página principal</a>";
?>

Descargar ejemplo

Observa que es necesario incluir la definición de la Clase antes de session_start().

También podemos propagar Objetos creados dinámicamente (al ser creados de dicha forma no será necesario incluir archivo alguno).

Dependiendo de la configuración de PHP es posible que necesites serializar el objeto usando la función de PHP serialize() antes de pasarlo a la otra página, en la cual mediante unserialize() lo convertiremos de nuevo en un Objeto de PHP.

Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso