【问题标题】:Converting Session $data Into An Array?将会话 $data 转换为数组?
【发布时间】:2012-01-16 19:09:31
【问题描述】:

在会话保存处理程序的写入函数中,$data 以如下格式传递:

测试|a:1:{s:3:"foo";s:3:"bar";}session|a:2:{s:10:"isLoggedIn";b:1;s:8: "clientId";s:5:"12345 ";}

有没有办法将其转换为正确的数组:

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

我尝试将其传递给反序列化,但出现以下错误:

unserialize() [function.unserialize]:95 个字节的偏移量 0 处出错

它只是返回 false。

【问题讨论】:

  • 会话保存处理函数是什么样的?
  • 请正确序列化字符串,不要使用自定义函数。
  • 如果这是原始字符串,那么反序列化失败也就不足为奇了。它格式不正确。不要使用格式错误的输入。
  • 写函数长什么样子?

标签: php session serialization


【解决方案1】:

关于另一个答案。 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 );
}

【讨论】:

  • 我确信如果会话数据中已经有管道字符,这将不起作用。
  • 非常感谢您。至于|s。我在会话编码过程之前替换了管道,否则无法正确保存。解码后我替换替换。
  • 你救了我朋友 (y)
  • 经过5个小时的搜索终于成功了,非常感谢
【解决方案2】:

【讨论】:

  • 好的,这就是我想要的写入但是有一种方法可以将数组转换为有效的会话字符串以供读取(请注意,我想将会话作为数组存储在如果需要,mongodb 能够更好地调试会话数据)
  • 有一些很好的例子here
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2021-09-16
相关资源
最近更新 更多