反序列化有时会返回false

时间:2010-11-24 07:10:06

标签: php regex serialization

我的应用程序中有这个功能:

public function direct($theTree)
{
    $aTreeRoot = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $theTree);
    return unserialize($aTreeRoot);
}

它永远不会返回false,但在错误日志中会出现错误,表示返回false。

但是,我无法在我的应用程序中复制错误。我正在尝试一切可能的方式,但它始终有效。

这个功能有问题吗?

$theTree来自会话。

编辑:正则表达式是因为:unserialize - 在评论中搜索我的正则表达式。它应该解决一个问题。

6 个答案:

答案 0 :(得分:39)

我之前遇到过类似的问题。我告诉你我是如何解决它的。

序列化数据后,应用base64_encode() 例如

$txt = base64_encode(serialize($txt));

当你反序列化它时

e.g。

 $txt = unserialize(base64_decode($txt));

试试这个。希望也为你工作。祝你好运

答案 1 :(得分:1)

生产和本地计算机上magic_quotes_gpc的值是否相同?

答案 2 :(得分:1)

我的代码上有一些随机行为,但我想我发现了原因。我使用的是UTF-8字符集,在我的生产服务器中,它似乎产生了这些问题。 试试这个:

$txt = unserialize(utf8_encode($aTreeRoot));

为我工作,希望它也适合你

答案 3 :(得分:0)

我相信转发您序列化的数据也可以替代base64。

$data = serialize($results);
$encoded = htmlentities($data);
echo '<input type="hidden" name="data" value="'.$encoded.'">';

答案 4 :(得分:0)

我有类似的问题。原来数据库中存储序列化数组的列的归类为:latin1_swedish_ci

我将序列化数据列的排序规则更改为:utf8_bin,然后重新保存数据,瞧-问题已解决。

答案 5 :(得分:0)

对我来说,问题是要解串的字符串需要修剪!错误消息在这种情况下没有帮助,我通过查看其他代码偶然发现了该解决方案。

Foo: data
Bar: data
Closure: data