手机
当前位置:查字典教程网 >编程开发 >php教程 >php中unserialize返回false的解决方法
php中unserialize返回false的解决方法
摘要:本文实例讲述了php中unserialize返回false的解决方法,分享给大家供大家参考。具体方法如下:php提供serialize(序列...

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

php 提供serialize(序列化) 与unserialize(反序列化)方法。

使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。

先来看看如下程序实例:

<?php $arr = array( 'name' => 'fdipzone', 'gender' => 'male' ); $str = serialize($arr); //序列化 echo 'serialize str:'.$str."rnrn"; $content = unserialize($str); // 反序列化 echo "unserialize str:rn"; 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字符""被解析为 '',在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。

r在计算长度时也会出问题。

解决方法如下:

// utf8 function mb_unserialize($serial_str) { $serial_str= preg_replace('!s:(d+):"(.*"'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+):"(.*".strlen("$2").":"$2";"', $serial_str ); $serial_str= str_replace("r", "", $serial_str); return unserialize($serial_str); }

例子:

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'; // utf8 function mb_unserialize($serial_str) { $serial_str= preg_replace('!s:(d+):"(.*"'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的解决方法】相关文章:

php实现的简单日志写入函数

php获取twitter最新消息的方法

php限制ip地址范围的方法

php准确获取文件MIME类型的方法

php遍历类中包含的所有元素的方法

php中smarty实现多模版网站的方法

php使用数组填充下拉列表框的方法

php猴子选大王问题解决方法

php生成圆角图片的方法

php按单词截取字符串的方法

精品推荐
分类导航