php中的unserialize失败怎么解决-php unpack

本篇内容介绍了“php中的unseriapze失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php。

本篇内容介绍了“php中的unseriapze失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

php unseriapze失败的解决办法:1、修改序列化数据时的编码与反序列化时的编码为一致;2、使用处理过单双引号,过滤“\r”的“mb_unseriapze”方法。

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php unseriapze 失败怎么办?

php unseriapze 返回false的解决方法

php 提供seriapze(序列化) 与unseriapze(反序列化)方法。

使用seriapze序列化后,再使用unseriapze反序列化就可以获取原来的数据。

<?php
$arr=array(
'name'=>'fdipzone',
'gender'=>'male'
);

$str=seriapze($arr);//序列化
echo'seriapzestr:'.$str."\r\n\r\n";

$content=unseriapze($str);//反序列化
echo"unseriapzestr:\r\n";
var_dump($content);
?>

输出:

seriapzestr:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";}
unseriapzestr:
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(unseriapze($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
functionmb_unseriapze($serial_str){
$serial_str=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$serial_str);
$serial_str=str_replace("\r","",$serial_str);
returnunseriapze($serial_str);
}

//ascii
functionasc_unseriapze($serial_str){
$serial_str=preg_replace('!s:(\d+):"(.*?)";!se','"s:".strlen("$2").":\"$2\";"',$serial_str);
$serial_str=str_replace("\r","",$serial_str);
returnunseriapze($serial_str);
}

例子:

echo'<metahttp-equiv="content-type"content="text/html;charset=utf-8">';

//utf8
functionmb_unseriapze($serial_str){
$serial_str=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$serial_str);
$serial_str=str_replace("\r","",$serial_str);
returnunseriapze($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(unseriapze($str));//false

var_dump(mb_unseriapze($str));//正确

使用处理过单双引号,过滤\r的mb_unseriapze方法就能成功反序列化了。

使用unseriapze

bool(false)

使用mb_unseriapze

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中的unseriapze失败怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网站,小编将为大家输出更多高质量的实用文章!

本文php中的unserialize失败怎么解决整理到此结束,字数约4488字,希望对大家有所帮助。屹东网往后会继续推荐php中的unserialize失败怎么解决相关内容。