php中unserialize返回false的解决方法_PHP教程
php中unserialize返回false的解决方法
php 提供serialize(序列化) 与unserialize(反序列化)方法。
使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。
先来看看如下程序实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$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); ?> |
输出:
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 |
$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在计算长度时也会出问题。
解决方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 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); } |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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" } |
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
- 最新文章
- 热门排行
推荐阅读
-
php中unserialize返回false的解决方法_PHP教程
-
php中判断数组相等的方法以及数组运算符介绍,数组运算符_PHP教程
-
PHP与正则表达系列之一: PHP中的正则表达式_PHP教程
-
php 中require和include引用url和 php的文件编码转换函数问题_PHP教程
-
php读取mssql的ntext字段返回值为空的解决方法_PHP
-
Symfony2实现在controller中获取url的方法,symfony2controller_PHP教程
-
PHP获取数组中重复最多的元素的实现方法,php数组_PHP教程
-
PHP的Yii框架中Model模型的学习教程_php技巧
-
WordPress中设置Post Type自定义文章类型的实例教程_PHP
-
PHP处理JSON字符串key缺少双引号的解决方法,jsonkey_PHP教程
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论