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 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
用PHP解决的一个栈的面试题
Jul 02 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
js读取本地文件的实例
2017/12/22 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
微信小程序如何连接Java后台
2019/08/08 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
面试后感谢信怎么写
2014/02/01 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
Oracle中DBLink的详细介绍
2022/04/29 Oracle