【问题标题】:Unserialize sometimes returns false反序列化有时会返回 false
【发布时间】:2010-11-24 07:10:05
【问题描述】:

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

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

它永远不应该返回 false,但在错误日志中不断发生的错误表明它返回 false。

但是,我无法在我的应用程序中复制错误。我正在尝试所有可能的方法,但它总是有效。

函数有问题吗?

$theTree 来自会话。

编辑: 正则表达式在那里是因为:unserialize - 在 cmets 中搜索我的正则表达式。它应该可以解决问题。

【问题讨论】:

  • 这个preg_replacing真的有必要吗?这个 Igor 字符给出的提示此解决方法的示例是一个完全无效的序列化字符串。我不知道任何需要这样做的错误。如果你的字符串是用serialize 序列化的并且没有被修改,它应该unserialize 就好了。你是自己遇到这个问题,还是因为“它应该解决一个问题”而把它放进去?
  • @deceze:是的,没有那个正则表达式,反序列化不起作用。我将一个复杂的对象放入序列化的会话中,如果没有正则表达式,反序列化就会出现问题。正则表达式解决了这个问题,但似乎反序列化有时会返回 false。
  • 三重检查您的序列化字符串在某处的途中没有拾取任何额外字符,更改编码等。您能举一个失败的例子吗?
  • 我在序列化后将字符串从 Windows-1250 转换为 UTF-8。不确定这是否重要。
  • 并且 window-1250 不是 UTF-8 的直接子集。某些字符可能会在编码中丢失。所以,先尝试简单的字符。

标签: php regex serialization


【解决方案1】:

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

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

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

当你反序列化它时

例如

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

试试这个。希望对你也有用。祝你好运

【讨论】:

  • 我遇到了这个问题,这解决了它。谢谢!
  • 这是什么魔法?它确实有效......但很高兴理解!
  • 这就是为什么我永远不应该使用“序列化”“反序列化”。如果它没有做你期望它做的事情,那么为什么要使用它。 JSON 编码解码工作正常。
  • @Preexo base64 将数据编码为 ascii 字符串,绕过从数据库到服务器脚本的字符集问题,如果您从网络上抓取数据,那么:从源到数据库,回到你的脚本。翻译可能会出错。显然serializeunserialize 并不总是编码来解码自己,所以人们会遇到问题。如果您使用 base64,则在查看数据库中的原始条目时,您会直接查看数据。
【解决方案2】:

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

【讨论】:

  • 是的,魔术引号在本地和生产服务器上都已关闭。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    我相信转义您正在序列化的数据也可以作为 base64 的替代方法。

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

    【讨论】:

      【解决方案5】:

      我也有类似的问题。结果发现数据库中存储序列化数组的列的排序规则为:latin1_swedish_ci

      我将序列化数据列的排序规则更改为:utf8_bin 并重新存储数据,瞧 - 问题解决了。

      【讨论】:

        【解决方案6】:

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

        $unserialized = unserialize(trim($serialized));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2012-10-14
          相关资源
          最近更新 更多