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 相关文章推荐
将数组写入txt文件 var_export
Apr 21 PHP
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 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实现的SESSION类
2014/12/02 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python制作websocket服务器实例分享
2016/11/20 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python3中列表list合并的四种方法
2019/04/19 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
JPA的优势都有哪些
2013/07/04 面试题
中学家长会邀请函
2014/02/03 职场文书
机关办公室岗位职责
2014/04/16 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
劳模事迹材料范文
2014/12/24 职场文书
募捐感谢信
2015/01/22 职场文书
技术员个人工作总结
2015/03/03 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
css样式important规则的正确使用方式
2022/06/10 HTML / CSS