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图片验证码实例
Mar 21 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
php上传文件问题汇总
Jan 30 PHP
PHP数组相关函数汇总
Mar 24 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
nginx下安装php7+php5
Jul 31 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 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
php xml文件操作代码(一)
2009/03/20 PHP
PHP编码转换
2012/11/05 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python使用functools实现注解同步方法
2018/02/06 Python
对pandas处理json数据的方法详解
2019/02/08 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
django教程如何自学
2020/07/31 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
解释一下抽象方法和抽象类
2016/08/27 面试题
职业生涯规划书的格式
2013/12/29 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
奥林匹克的口号
2014/06/13 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
2014年导购员工作总结
2014/11/18 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis