关于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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前

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