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 相关文章推荐
PHP的中问验证码
Nov 25 PHP
PHP中for循环语句的几种变型
Nov 26 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
PHP中的string类型使用说明
Jul 27 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
php延迟静态绑定实例分析
Feb 08 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
分享3个php获取日历的函数
Sep 25 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Python信息抽取之乱码解决办法
2017/06/29 Python
Python实现识别手写数字大纲
2018/01/29 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python 实现按对象传值
2019/12/26 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
广告学专业应届生求职信
2013/10/01 职场文书
服务员岗位责任制
2014/02/11 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
教师工作能力自我评价
2015/03/04 职场文书
个人总结格式范文
2015/03/09 职场文书
房贷收入证明范本
2015/06/12 职场文书
感恩教育主题班会
2015/08/12 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
python使用glob检索文件的操作
2021/05/20 Python
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL