PHP 7.2中反序列化字符串的问题

时间:2019-01-27 07:58:51

标签: php serialization

当我取消序列化它在php 5.6之前无法使用php 7.2时,我已经序列化了图像路径并保存到数据库。

a:1:{i:0;a:3:{s:8:"fullpath";s:77:"https://www.educationfolder.com/files1/user-pics/4/142944540636159131_ml.jpg";s:5:"image";s:27:"4/142944540636159131_ml.jpg";s:10:"mention_id";s:3:"398";}}


function made for this are 
function maybe_serialize( $data ) {
if ( is_array( $data ) || is_object( $data ) )
    return serialize( $data );
// Double serialization is required for backward compatibility.
// See http://core.trac.wordpress.org/ticket/12930
if ( is_serialized( $data, false ) )
    return serialize( $data );
return $data;
}

function maybe_unserialize( $original ) {
if ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in
    return @unserialize( $original );
return $original;
}

现在我正在这样做

$imageArr = array();

$imageArr = maybe_unserialize(trim($image_url));

及其不起作用

3 个答案:

答案 0 :(得分:1)

我已使用功能中的快速修复解决了此问题,此错误是由于更改了序列化数据长度引起的。

$data = preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) { return 's:'.mb_strlen($m[2]).':"'.$m[2].'";'; }, $data);

function maybe_unserialize( $original ) {
if ( is_serialized($original) ) // don't attempt to unserialize data that wasn't serialized going in

$original = preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) { return 's:'.mb_strlen($m[2]).':"'.$m[2].'";'; }, $original);
    return @unserialize($original);
return $original;

}

答案 1 :(得分:0)

您是否手动编辑了序列化的字符串?图片网址为76个字符,但在您的序列化字符串中为77。

$img = 'a:1:{i:0;a:3:{s:8:"fullpath";s:76:"https://www.educationfolder.com/files1/user-pics/4/142944540636159131_ml.jpg";s:5:"image";s:27:"4/142944540636159131_ml.jpg";s:10:"mention_id";s:3:"398";}}';

$img = maybe_unserialize($img);

echo $img[0]['fullpath'];

顺便说一下,这些都是WordPress Core的功能。 @之前的unserialize禁止显示警告。您可以直接将unserialize()与原始序列化字符串一起使用,而无需使用@并获取:

Notice: unserialize(): Error at offset 112 of 190 bytes

3v4l中的示例:

https://3v4l.org/3NWlD

答案 2 :(得分:0)

如果您经常使用正则表达式,则可以使用T-Regx tool

pattern('s:(\d+):"(.*?)";')->replace($original)->callback(function(Match $m) { 
    return 's:' . $m->group(2)->length() . ':"' . $m->group(2) . '";'; 
});

它具有自动定界符。