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));    // falsevar_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"
}

转载于:https://www.cnblogs.com/yxwkf/p/5417439.html

php unserialize 返回false的解决方法相关推荐

  1. 安装pytorch 后torch.cuda.is_available()返回False的解决方法

    今年安装pytorch 后一直只能安装上CPU版本,不能使用GPU. 参考了这篇博客的方法:完美解决torch.cuda.is_available()一直返回False的玄学方法(完美解决torch. ...

  2. List的contains方法老是返回false的解决法

    List的contains方法老是返回false的解决法: 今天遇到一个奇怪的问题, String hql="select ur.id.userId from SysUserRole ur, ...

  3. 安装pytorch报错torch.cuda.is_available()=false的解决方法

    问题介绍 在安装torch之后,命令行(Anaconda Powershell Prompt)运行这三行代码: python # python import torch torch.cuda.is_a ...

  4. 出现should be mapped with insert=“false“ update=“false“的解决方法

    出现should be mapped with insert="false" update="false"的解决方法 参考文章: (1)出现should be ...

  5. ios7自定义返回按钮后,右滑返回功能失效解决方法

    ios7自定义返回按钮后,右滑返回功能失效解决方法 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; //开 ...

  6. [datatable]关于在DataTable中执行DataTable.Select(“条件“)返回DataTable的解决方法

    [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 参考文章: (1)[datatable]关于在Da ...

  7. scrapy 的依赖库安装和出现def write(self, data, async=False):的解决方法

    scrapy 的依赖库安装和出现def write(self, data, async=False):的解决方法 参考文章: (1)scrapy 的依赖库安装和出现def write(self, da ...

  8. “git push”后返回“Error 403”解决方法

    "git push"后返回"Error 403"解决方法 参考文章: (1)"git push"后返回"Error 403&quo ...

  9. 接口返回[object,Object]解决方法

    接口返回[object,Object]解决方法 参考文章: (1)接口返回[object,Object]解决方法 (2)https://www.cnblogs.com/kaiqinzhang/p/10 ...

最新文章

  1. Java异常处理12条军规
  2. Python 与 Excel结合
  3. Qt中另一种创建线程的方式
  4. java微信群自动回复_Java故事之路在脚下
  5. 递归-递归的特点及基本代码演练
  6. merge用法linux,Merge用法
  7. 底层知识学习记录目录表
  8. 又一低代码平台火了!15 分钟小白轻松开发在线课堂,人人都是开发者时代来了?
  9. 利用Postman测试智慧交通系统接口
  10. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...
  11. Python可视化工具Matplotlib 3.0版出炉,改进默认后端选择,饼图终于变圆了
  12. Java 大对象类型的 Hiberante 映射
  13. ubuntu 安装openproj-1.4-2.noarch.rpm
  14. android app 用什么语言开发的?
  15. 史上最长的介绍BI(商业智能)的干货
  16. 男生说fb是什么梗_男生聊污是什么意思 男生会对谁聊污
  17. 链接、图像、列表、计数器
  18. 树莓派(Raspberry pi) 使用Pi Imager安装烧录操作系统
  19. STM32之SPI和W25Q128
  20. 2021-2025年中国脱水泵行业市场供需与战略研究报告

热门文章

  1. 漫步微积分三十六——曲面的面积
  2. 【图像处理】RGB图像边缘检测
  3. CSS基础必备知识点03
  4. TensorFlow 第二步 小试牛刀:一个神经元
  5. excel表中怎么让隐藏的表格中不粘贴内容-制作autohotkey快捷键
  6. C++/C--istringstream、ostringstream、stringstream 类介绍【转载】
  7. Opencv--图像处理之一阶和二阶偏导数
  8. 判断是否为质数的超级优化 C++语言(超详细)
  9. java控制面板作用_大师为你分析win7系统打开java控制面板的方法
  10. sim7020c功耗_SIM7020C物联网NB-IOT模块 simcom代理