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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
PHP版自动生成文章摘要
Jul 23 PHP
php str_pad 函数用法简介
Jul 11 PHP
php实现单链表的实例代码
Mar 22 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
vue keep-alive的简单总结
2021/01/25 Vue.js
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
我们的节日清明节活动方案
2014/03/05 职场文书
导师工作推荐信范文
2014/05/17 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python