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 相关文章推荐
10 个经典PHP函数
Oct 17 PHP
PHP中判断文件存在使用is_file还是file_exists?
Apr 03 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
php文件上传的两种实现方法
Apr 04 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 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
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
img标签中onerror用法
2009/08/13 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
js模拟微博发布消息
2017/02/23 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
Python WEB应用部署的实现方法
2019/01/02 Python
Django model select的多种用法详解
2019/07/16 Python
python实现拼接图片
2020/03/23 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Python下载的11种姿势(小结)
2020/11/18 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
保洁公司服务承诺书
2014/05/28 职场文书
个人委托书范本
2014/09/13 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL