前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php unserialize 返回false的解决方法

php unserialize 返回false的解决方法

作者头像
全栈程序员站长
发布2022-07-11 09:19:27
9780
发布2022-07-11 09:19:27
举报

大家好,又见面了,我是全栈君。

php unserialize 返回false的解决方法

php 提供serialize(序列化) 与unserialize(反序列化)方法。

使用serialize序列化后。再使用unserialize反序列化就能够获取原来的数据。

代码语言:javascript
复制
<?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);?>

输出:

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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在计算长度时也会出问题。

解决方法例如以下:

代码语言:javascript
复制
// 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);}// asciifunction 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);}

样例:

代码语言:javascript
复制
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方法就能成功反序列化了。

代码语言:javascript
复制
使用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://javaforall.cn/115245.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月7,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档