2011-12-09 8 views
7

En la función de escritura para un manejador de sesiones $ se pasan los datos en un formato como este:

prueba | a: 1: {s: 3: "foo"; s: 3: "barra"; } sesión | a: 2: {s: 10: "IsLoggedIn"; b: 1; s: 8: "clientId"; s: 5: "12345 ";}

¿hay una manera de convertir que en la matriz adecuada, que sería:

array 
(
    'test' => array 
    (
     'foo' => 'bar' 
    ) 
    'session' => array 
    (
     'isLoggedIn' => true 
     'clientId' => '12345' 
    ) 
) 

traté de paso, que en unserialize pero me da un error de:

unserialize() [function.unserialize]: Error en la posición 0 de 95 bytes

y que sólo se devuelven false.

+0

¿Cómo es la función del controlador de guardar sesión? –

+0

Por favor, serialice correctamente la cadena, no use alguna función personalizada. – NikiC

+0

Si esta es la cadena original, entonces no es de extrañar que la deserialización falle. Está mal formado. No use entradas mal formadas. –

Respuesta

3
+0

'session_decode()' devuelve 'false' en esa cadena. –

+0

ok, bueno eso hace lo que quiero para la escritura, pero hay una manera de convertir una matriz en una cadena de sesión válida para la lectura (tenga en cuenta que quiero almacenar la sesión como una matriz en mongodb para poder depurar mejor datos de sesión si es necesario) – ryanzec

+0

Hay algunos buenos ejemplos [aquí] (http://www.php.net/manual/en/function.session-encode.php) –

7

sobre la otra respuesta. la descripción de session_decode es "session_decode() decodifica los datos de sesión en datos, configura las variables almacenadas en la sesión." Eso no suena como que hace lo que necesita ... y también siempre devolverá bool después de analizar una cadena.

Por otro lado, si la cadena que proporcionó como ejemplo tuvo un error, el espacio después de "12345" (y parece un error porque delante de él puede ver que el siguiente valor debe ser una cadena con la longitud 5) puede usar esta función:

function unserialize_session_data($serialized_string) 
{ 
    $variables = array(); 
    $a = preg_split("/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

    for($i = 0; $i<count($a); $i = $i+2) 
    { 
     if(isset($a[$i+1])) 
     { 
       $variables[$a[$i]] = unserialize($a[$i+1]); 
     } 
    } 
    return($variables); 
} 
+0

aquí hay un enlace que muestra que este ejemplo funciona: http://codepad.org/32C0pwyZ – mishu

+1

Estoy seguro de que esto no funcionará si ya hay caracteres de canal en los datos de la sesión. – cgTag

+1

Muchas gracias por esto. En cuanto a | s. Sustituyo las tuberías antes del proceso de codificación de la sesión o no se guarda correctamente. Después de la decodificación, reemplazo el reemplazo. –

Cuestiones relacionadas