Foros del Web » Programando para Internet » PHP »

Variables de sesión vacías (cookies deshabilitadas en navegador)

Estas en el tema de Variables de sesión vacías (cookies deshabilitadas en navegador) en el foro de PHP en Foros del Web. Hola a todos! Después de leer las FAQ y millones de mensajes y tutoriales, soy incapaz de recuperar las variables de sesión. Obviamente, algo se ...
  #1 (permalink)  
Antiguo 17/04/2012, 09:41
 
Fecha de Ingreso: enero-2010
Mensajes: 69
Antigüedad: 14 años, 3 meses
Puntos: 0
Variables de sesión vacías (cookies deshabilitadas en navegador)

Hola a todos!

Después de leer las FAQ y millones de mensajes y tutoriales, soy incapaz de recuperar las variables de sesión. Obviamente, algo se me está escapando. Describo mi situación:

El contexto es el siguiente. En el php.ini, las opciones especificadas son las siguientes:

Código PHP:
session.save_handler files
session
.save_path "./sesiones"
session.use_cookies 
session
.use_only_cookies 0
session
.name PHPSESSID
session
.cookie_lifetime 0
session
.cookie_path = /
session.cookie_domain =
session.cookie_httponly 
session.serialize_handler php
session
.gc_probability 1
session
.gc_divisor 1000
session
.bug_compat_42 Off
session
.bug_compat_warn Off
session
.referer_check =
session.entropy_length 0
session
.entropy_file =
session.cache_expire 180
session
.use_trans_sid 1
session
.hash_function 0
session
.hash_bits_per_character 5
url_rewriter
.tags "a=href,area=href,frame=src,input=src,form=fakeentry" 
Y mis archivos de prueba son los siguientes (supongo que ya os sonarán):

Archivo "page1.php":

Código PHP:
session_name("prueba");
session_start();

echo 
'Welcome to page #1';

$_SESSION['favcolor'] = 'green';
$_SESSION['animal']   = 'cat';
$_SESSION['time']     = time();

// Works if session cookie was accepted
echo '<br /><a href="page2.php">page 2</a>';

// Or maybe pass along the session id, if needed
echo '<br /><a href="page2.php?' SID '">page 2</a>'
Archivo "page2.php":

Código PHP:

session_id
($_GET['prueba']);
session_start();



if (
defined('SID')){
   echo 
'Session is active<BR>';
}else{
   echo 
'Session is not started<BR>';
}


echo 
'<br>Welcome to page #2<br />';
echo 
$_SESSION['favcolor']."<BR>"// green
echo $_SESSION['animal']."<BR>";   // cat
echo $_SESSION['time']."<BR>";
print_r($_COOKIE);

// You may want to use SID here, like we did in page1.php
echo '<br /><a href="page1.php?'.SID.'">page 1</a>'
Mi objetivo es recuperar la sesión mediante cookies si el navegador las tiene habilitadas, o mediante el paso de la variable SID por URL en caso contrario. El primer caso está solucionado, es el segundo el que no.

Al pasar de "page1.php" a "page2.php", se envía correctamente la variable SID, y si echo un ojo al directorio "sesiones", especificado en el php.ini, veo que, en efecto, las variables de sesión 'favcolor', 'animal' y 'time' están correctamente almacenadas. Pero no encuentro la forma de recuperar sus valores.

He visto que los archivos de sesiones creados tienen la forma "sess_" + SID, no creo que haga falta abrir el archivo de la sesión y de ahí recuperar las variables, ¿o sí?

Asimismo, antes, en el php.ini, el valor de "use_only_cookies" estaba puesto a 1, supongo que en tal caso es imposible recuperar la sesión si no es por medio de las cookies, por lo que he puesto su valor a 0.

Os agradecería infinitamente que me echárais una mano, llevo con hoy tres días y no le encuentro el truco.

Muchísimas gracias de antemano
  #2 (permalink)  
Antiguo 17/04/2012, 10:23
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Variables de sesión vacías (cookies deshabilitadas en navegador)

En page2.php utiliza print_r($_SESSION) para ver qué hay en la session.
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 17/04/2012, 10:30
 
Fecha de Ingreso: enero-2010
Mensajes: 69
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Variables de sesión vacías (cookies deshabilitadas en navegador)

Hola repara2!

El print_r($_COOKIE) se me coló, en realidad tengo print_r($_SESSION) y, en efecto, está vacía, muestra "Array()"...
  #4 (permalink)  
Antiguo 17/04/2012, 11:24
 
Fecha de Ingreso: enero-2010
Mensajes: 69
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Variables de sesión vacías (cookies deshabilitadas en navegador)

No estoy seguro, pero creo que los tiros pueden ir por el save_handler. Estoy viendo que existen las siguientes funciones:

function open ($save_path, $session_name): se llama luego de cada session_start, recibe un path y un nombre de sesión que por omisión es PHPSESSID.

function close() Cierra la sesión.

function read ($key) Dada una clave “key” recupera para la sesión actual el valor de la clave pasada.

function write ($key, $val) Guarda un par clave-valor para la sesión actual.

function destroy ($key) Destruye la clave pasada como parámetro.

function gc($maxlifetime) Garbage collection, se encarga de destruir los datos de las sesiones Php vencidas.

Aún no he "escarbado" más en el asunto, voy a mirarlo ahora, pero, ¿creéis que puede estar ahí el problema? ¿Es posible que tenga que utilizar estas funciones para recuperar las sesiones almacenadas en ficheros?
  #5 (permalink)  
Antiguo 17/04/2012, 12:00
 
Fecha de Ingreso: enero-2010
Mensajes: 69
Antigüedad: 14 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Variables de sesión vacías (cookies deshabilitadas en navegador)

Ya está!

Finalmente sí, era necesario acceder a los archivos de sesiones creados, pero no de forma manual sino utilizando un gestor de sesiones (una clase que implemente las funciones open, close, read, write, destroy y gc) y una llamada a la función session_set_save_handler.

Para quienes se encuentren en la misma situación que yo, les adjunto el código. El de page1.php es el mismo que el anteriormente descrito, mientras que el page2.php debe contener lo siguiente (es un mero ejemplo):

Código PHP:
<?php

class FileSessionHandler
{
    private 
$savePath;

    function 
open($savePath$sessionName)
    {
        
$this->savePath $savePath;
        if (!
is_dir($this->savePath)) {
            
mkdir($this->savePath0777);
        }

        return 
true;
    }

    function 
close()
    {
        return 
true;
    }

    function 
read($id)
    {
        return (string)@
file_get_contents("$this->savePath/sess_$id");
    }

    function 
write($id$data)
    {
        return 
file_put_contents("$this->savePath/sess_$id"$data) === false false true;
    }

    function 
destroy($id)
    {
        
$file "$this->savePath/sess_$id";
        if (
file_exists($file)) {
            
unlink($file);
        }

        return 
true;
    }

    function 
gc($maxlifetime)
    {
        foreach (
glob("$this->savePath/sess_*") as $file) {
            if (
filemtime($file) + $maxlifetime time() && file_exists($file)) {
                
unlink($file);
            }
        }

        return 
true;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler(
    array(
$handler'open'),
    array(
$handler'close'),
    array(
$handler'read'),
    array(
$handler'write'),
    array(
$handler'destroy'),
    array(
$handler'gc')
    );

// lo siguiente previene de efectos inesperados al usar objetos como gestores de almacenamiento
register_shutdown_function('session_write_close');

session_id($_GET['prueba']);

session_name("prueba");
session_start();

echo 
"<br>color: ".$_SESSION['favcolor']."<br>";

Etiquetas: cookies, sesión, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:39.