2011-12-09 57 views
7

在一个会话保存处理$数据的写入功能的格式传递这样的:

测试|一:1:{S:3: “富”; S:3: “巴”; }会话|一个:2:{S:10: “isLoggedIn”; b:1; S:8: “的clientId”; S:5: “12345 ”;}

有一种方法来转换即到适当的数组这将是:

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

我想传递一个为反序列化,但我得到的错误:

反序列化()[function.unserialize]:错误在偏移0 95字节

,它只是返回false。

+0

什么会话保存处理函数看起来像? –

+0

请正确序列化字符串,不要使用一些自定义函数。 – NikiC

+0

如果这是原始字符串,那么难怪反序列化失败。它是畸形的。不要使用格式不正确的输入。 –

回答

3
+0

'session_decode()'在该字符串上返回'false'。 –

+0

好吧,那是我想要的写作然而,有没有办法将数组转换为读取有效的会话字符串(请注意,我想将会话存储为mongodb中的数组,以便能够更好地进行调试会话数据,如果我需要) – ryanzec

+0

有一些很好的例子[这里](http://www.php.net/manual/en/function.session-encode.php) –

7

关于其他答案。 session_decode的描述是“session_decode()解码数据中的会话数据,设置会话中存储的变量”,听起来并不像你所需要的那样..并且它总是在解析字符串后返回bool。

另一方面,如果你提供的字符串作为例子有一个错误,“12345”后面的空格(它看起来像一个错误,因为在它前面你可以看到下面的值应该是一个字符串与长度5)你可以使用这个功能:

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

这里是一个链接,显示这个例子的工作原理: http://codepad.org/32C0pwyZ – mishu

+1

我相信如果会话数据中已经有管道字符,这将不起作用。 – cgTag

+1

非常感谢你。至于| s。我在会话编码过程之前替换了管道,或者无法正确保存。解码后,我替换替换。 –