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初学者常见问题集合 修正版(21问答)
Mar 23 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
Yii调试SQL的常用方法
Jul 09 PHP
php强制用户转向www域名的方法
Jun 19 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 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
一个简单实现多条件查询的例子
2006/10/09 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
小谈php正则提取图片地址
2014/03/27 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
简单的编程0基础下Python入门指引
2015/04/01 Python
python多线程方式执行多个bat代码
2016/06/07 Python
python 循环while和for in简单实例
2016/08/16 Python
django queryset相加和筛选教程
2020/05/18 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
Python如何操作docker redis过程解析
2020/08/10 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
应用化学专业职业生涯规划书
2014/01/22 职场文书
2014学年自我鉴定
2014/02/23 职场文书
节约电力资源的建议书
2014/03/12 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android