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 相关文章推荐
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
php中根据变量的类型 选择echo或dump
Jul 05 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
Laravel实现批量更新多条数据
Apr 06 PHP
PHP 99乘法表的几种实现代码
Oct 13 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
python 自动识别并连接串口的实现
2021/01/19 Python
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
中医专业职业生涯规划书范文
2014/01/04 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
PHP中strval()函数实例用法
2021/06/07 PHP