关于php7反序列化失败

反序列化数据时发现以下数据在php5.3可以得到相同数组,在php7.3下$desc1false$desc2是可以执行成功。不知道这个有没有办法处理

$data1 = 'a:2:{s:9:"spec_name";s:6:"口味";s:10:"spec_value";a:2:{i:0;a:3:{s:5:"price";s:2:"10";s:4:"name";s:12:"巧克力味";s:5:"store";s:3:"700";}i:1;a:3:{s:5:"price";s:2:"20";s:4:"name";s:6:"原味";s:5:"store";r:7;}}}';

$data2 = 'a:2:{s:9:"spec_name";s:6:"口味";s:10:"spec_value";a:2:{i:0;a:3:{s:5:"price";s:2:"10";s:4:"name";s:12:"巧克力味";s:5:"store";s:3:"700";}i:1;a:3:{s:5:"price";s:2:"20";s:4:"name";s:6:"原味";s:5:"store";s:3:"700";}}}';
$desc1 = unserialize($data1);
$desc2 = unserialize($data2);
var_dump($desc1);
var_dump($desc2);
php
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

这是官方文档里给出的可以设置的回调函数,你可以自己写一个异常检查函数修复不正确的内容

ini_set('unserialize_callback_func', 'mycallback');

function mycallback($classname) 
{
    // just include a file containing your class definition
    // you get $classname to figure out which class definition is required
}

思路是通过 $types = array('s' => 'string', 'a' => 'array', 'b' => 'bool', 'i' => 'int', 'd' => 'float', 'N;' => 'NULL'); 和 explode 函数再加递归就可以实现,或者用正则替换也可以实现。

2年前 评论
imsugar (楼主) 2年前
aab 2年前
讨论数量: 2
aab

有一点搞不明白的是,序列号会在不同版本的php上执行,而且 5.3 和 7的差距也太远了! 对比一下,感觉是第一个 序列化字符串的 最后 r:7 这里有问题,可以在两个版本上比对一下!

2年前 评论
imsugar (楼主) 2年前

这是官方文档里给出的可以设置的回调函数,你可以自己写一个异常检查函数修复不正确的内容

ini_set('unserialize_callback_func', 'mycallback');

function mycallback($classname) 
{
    // just include a file containing your class definition
    // you get $classname to figure out which class definition is required
}

思路是通过 $types = array('s' => 'string', 'a' => 'array', 'b' => 'bool', 'i' => 'int', 'd' => 'float', 'N;' => 'NULL'); 和 explode 函数再加递归就可以实现,或者用正则替换也可以实现。

2年前 评论
imsugar (楼主) 2年前
aab 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!