php unserialize 返回false的解决方法

php unserialize 返回false的解决方法

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

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


样例:

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"
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115245.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DenseNet模型[通俗易懂]

    DenseNet模型[通俗易懂]《DenselyConnectedConvolutionalNetworks》阅读笔记代码地址:https://github.com/liuzhuang13/DenseNet首先看一张图:稠密连接:每层以之前层的输出为输入,对于有L层的传统网络,一共有LL个连接,对于DenseNet,则有L(L+1)2\frac{L(L+1)}2。这篇论文主要参考了HighwayNetw

    2022年9月29日
    0
  • 一个让WordPress媒体库支持外链图片的插件

    一个让WordPress媒体库支持外链图片的插件最近有一个月左右没更新了,因为这个月的业余时间都在忙于一个WordPress插件:ExternalMediawithoutImport。其实只是很小很简单的一个插件,代码不过短短几百行。不过这东西一旦被当成产品认真做起来,依然让我感到——每天在上班时间以外,应对完工作上的需求和bug之后,接着还要在业余时间认真做好另一个产品是多么劳心劳力。这是我正式发布并打算认真维护的第一个个人

    2022年6月18日
    20
  • jar和war的区别

    jar和war的区别Jar、war在文件结构上,二者并没有什么不同,它们都采用zip或jar档案文件压缩格式。但是它们的使用目的有所区别:jar1.Jar文件(扩展名为.Jar,JavaApplicationArchive)包含Java类的普通库、资源(resources)、辅助文件(auxiliaryfiles)等。2.jar包是java打的包,一般只是包括一些编译后class文件和一些部署文件,在声…

    2022年5月24日
    41
  • c语言中的short是什么意思_c语言中short占几个字节

    c语言中的short是什么意思_c语言中short占几个字节Java中没有Int32,Int64,,只有int,short,longJava中int就代表Int32,short就代表Int16,long就代表Int64首先,几个基本的关键字:Int16=short,占2个字节.-32768~32767Int32=int,占4个字节.-2147483648~2147483647Int64=long,占8个字…

    2022年9月19日
    0
  • 电脑安装winpe_北京科兴中维新冠疫苗最新消息

    电脑安装winpe_北京科兴中维新冠疫苗最新消息在WinPE安装操作系统,最好用虚拟光驱打开安装镜像文件,或者把镜像文件解压后直接安装。最好不要用工具盘里所带的一键安装,复制等等功能,因为这些功能往往会安装一些其他的附带功能,不是清洁版的。转载于:https://www.cnblogs.com/cuihongyu3503319/p/4657993.html…

    2025年5月28日
    0
  • kit中文_flask和django的对比

    kit中文_flask和django的对比#介绍ImageKit是用于处理图像的Django应用程序。如果需要从原图上生成一个长宽为50×50的图像,则需要ImageKit。ImageKit附带了一系列图像处理器,用于调整大小和裁剪等常见

    2022年7月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号