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&amp;mysql(一)
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
常用PHP框架功能对照表
Oct 23 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
php中使用session防止用户非法登录后台的方法
Jan 27 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
PHP培训要多少钱
Jun 06 PHP
PHP回调函数简单用法示例
May 08 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
angular4自定义表单控件[(ngModel)]的实现
2018/11/23 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python获取txt文件词向量过程详解
2019/07/05 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
图书室管理制度
2014/01/19 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL