代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

Unserialize有时返回false

  •  5
  • Richard Knop  · 技术社区  · 14 年前

    我的应用程序中有此功能:

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

    它不应该返回false,但是在错误日志中,错误一直在发生,这表明它返回了false。

    但是,我无法复制应用程序中的错误。我想尽一切办法,但总是有效的。

    功能有问题吗?

    这个 $theTree 来自会话。

    编辑: regex之所以出现是因为: unserialize -在评论中搜索我的regex。它应该能解决一个问题。

    4 回复  |  直到 12 年前
        1
  •  40
  •   Poonam Bhatt    14 年前

    我以前也遇到过类似的问题。我告诉你我是怎么解决的。

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

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

    当你取消它的工业化

    例如

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

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

        2
  •  1
  •   racetrack    14 年前

    magic_quotes_gpc 生产和你的本地机器都一样?

        3
  •  1
  •   Federico Giraldi    11 年前

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

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

    为我工作,希望对你也一样

        4
  •  0
  •   badcrocodile    8 年前

    我相信对序列化的数据进行转义也可以作为base64的替代方法。

    $data = serialize($results);
    $encoded = htmlentities($data);
    echo '<input type="hidden" name="data" value="'.$encoded.'">';
    
        5
  •  0
  •   php-b-grader    5 年前

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

    我将序列化数据列的排序规则更改为: utf8_bin 并对数据进行再验证,解决了问题。