• 技术文章 >后端开发 >php教程

    php中unserialize返回false的解决方法,unserializefalse_PHP教程

    2016-07-13 10:18:29原创376

    php中unserialize返回false的解决方法,unserializefalse


    本文实例讲述了php中unserialize返回false的解决方法,分享给大家供大家参考。具体方法如下:

    php 提供serialize(序列化) 与unserialize(反序列化)方法。
    使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。

    先来看看如下程序实例:

    <?php 
    $arr = array( 
      'name' => 'fdipzone', 
      'gender' => 'male' 
    ); 
     
    $str = serialize($arr); //序列化 
    echo 'serialize str:'.$str."\r\n\r\n"; 
     
    $content = unserialize($str); // 反序列化 
    echo "unserialize str:\r\n"; 
    var_dump($content); 
    ?> 
    
    

    输出:

    serialize str:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";} 
     
    unserialize str: 
    array(2) { 
     ["name"]=> 
     string(8) "fdipzone" 
     ["gender"]=> 
     string(4) "male" 
    } 
    
    

    但下面这个例子反序列化会返回false

    <?php 
    $str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}'; 
    var_dump(unserialize($str)); // bool(false) 
    ?> 
    
    

    检查序列化后的字符串,发现出问题是在两处地方:

    s:5:"url"
    s:29:"http://www.baidu.com/test.html"
    这两处应为
    s:3:"url"
    s:30:"http://www.baidu.com/test.html"

    出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。
    另外有可能出问题的还有单双引号,ascii字符"\0"被解析为 '\0',\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。
    \r在计算长度时也会出问题。

    解决方法如下:

    // utf8 
    function mb_unserialize($serial_str) { 
      $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); 
      $serial_str= str_replace("\r", "", $serial_str); 
      return unserialize($serial_str); 
    } 
     
    // ascii 
    function asc_unserialize($serial_str) { 
      $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str ); 
      $serial_str= str_replace("\r", "", $serial_str); 
      return unserialize($serial_str); 
    } 
    
    

    例子:

    echo ''; 
     
    // utf8 
    function mb_unserialize($serial_str) { 
      $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); 
      $serial_str= str_replace("\r", "", $serial_str); 
      return unserialize($serial_str); 
    } 
     
    $str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}'; 
     
    var_dump(unserialize($str));  // false 
     
    var_dump(mb_unserialize($str)); // 正确 
    
    

    使用处理过单双引号,过滤\r的mb_unserialize方法就能成功反序列化了。

    使用unserialize:

    bool(false)

    使用mb_unserialize

    array(9) { 
     ["time"]=> 
     int(1405306402) 
     ["name"]=> 
     string(6) "新晨" 
     ["url"]=> 
     string(1) "-" 
     ["word"]=> 
     string(1) "-" 
     ["rpage"]=> 
     string(30) "http://www.baidu.com/test.html" 
     ["cpage"]=> 
     string(1) "-" 
     ["ip"]=> 
     string(15) "117.151.180.150" 
     ["ip_city"]=> 
     string(31) "中国北京市 北京市移动" 
     ["miao"]=> 
     string(1) "5" 
    }
    
    

    希望本文所述对大家PHP程序设计的学习有所帮助。


    php 的 unserialize() 函数,返回false 怎解决,

    返回false说明你的数据有问题,查询一下你的储存数据是否格式正确。
     

    PHP中 unserialize($str)返回 FALSE,打印出$str并写入括号就可以成功,问是为何

    这是编码的问题,数据库的编码和PHP文件的编码不一致。
    你打印出来文本,经过复制黏贴,其实就是一次编码转换了。
     

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/882910.htmlTechArticlephp中unserialize返回false的解决方法,unserializefalse 本文实例讲述了php中unserialize返回false的解决方法,分享给大家供大家参考。具体方法如下:...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php unserialize
    上一篇:php实现的CSS更新类实例,phpcss更新实例_PHP教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文详解PHP用流方式实现下载文件(附代码示例)• PHP反序列化入门总结(小白必看)• PHP原生类的总结分享• 聊聊PHP escapeshellarg函数使用的中文问题• 分享PHP函数使用小工具(附代码示例)
    1/1

    PHP中文网