php中unserialize返回false的解决方法


Posted in PHP onSeptember 22, 2014

本文实例讲述了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 '<meta http-equiv="content-type" content="text/html; charset=utf-8">'; 
 
// 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 相关文章推荐
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
PHP程序61条面向对象分析设计的经验小结
Nov 12 PHP
php学习笔记之 函数声明
Jun 09 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
php实现paypal 授权登录
May 28 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
PHP简单读取xml文件的方法示例
Apr 20 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
php实现根据字符串生成对应数组的方法
Sep 22 #PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 #PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 #PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 #PHP
PHP中常用的输出函数总结
Sep 22 #PHP
C#静态方法与非静态方法实例分析
Sep 22 #PHP
php操作csv文件代码实例汇总
Sep 22 #PHP
You might like
程序员编程十条戒律
2009/07/09 PHP
php 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
设计专业自荐信
2014/06/19 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
运动会班级前导词
2015/07/20 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL