PHP unserialize 输出false,怎么解决谢谢!

array(10) {
[3]=>
string(5) "17.81"
[4]=>
string(5) "17.61"
[9]=>
string(5) "15.38"
[1]=>
string(5) "11.45"
[7]=>
string(5) "9.353"
[0]=>
string(5) "8.918"
[2]=>
string(5) "8.918"
[6]=>
string(5) "4.838"
[5]=>
string(5) "3.580"
[8]=>
string(5) "2.121"
}
上面是serialize前的数组,serialize之后为:
string(167) "a:10:{i:3;s:5:"17.81";i:4;s:5:"17.61";i:9;s:5:"15.38";i:1;s:5:"11.45";i:7;s:5:"9.353";i:0;s:5:"8.918";i:2;s:5:"8.918";i:6;s:5:"4.838";i:5;s:5:"3.580";i:8;s:5:"2.121";}"
存进MySQL数据库,字段设置的是varchar,字符集为utf8,内容为:
a:10:{i:3;s:5:"17.81";i:4;s:5:"17.61";i:9;s:5:"15.38";i:1;s:5:"11.45";i:7;s:5:"9.353";i:0;s:5:"8.918";i:2;s:5:"8.918";i:6;s:5:"4.838";i:5;s:5:"3.580";i:8;s:5:"2.121";}
用unserialize之后,输出的是bool(false),PHP版本5.6,急,在线等!谢谢!

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

使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。
图片说明

输出:

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
图片说明
检查序列化后的字符串,发现出问题是在两处地方

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在计算长度时也会出问题。
图片说明
图片说明
图片说明

使用处理过单双引号,过滤\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" }