проблема в несериализации строки в php 7.2 - PullRequest
0 голосов
/ 27 января 2019

Я сериализовал путь к изображению и сохранил в базе данных, когда я отменяю его работу с php 7.2 до того, как он работал с php 5.6.

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 голосов
/ 27 января 2019

Я решил эту проблему с помощью функции быстрого исправления, эта ошибка появлялась из-за измененной длины сериализованных данных.

$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;

}

0 голосов
/ 30 января 2019

Если вы часто используете регулярные выражения, вы можете использовать T-Regx tool :

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

Он имеет автоматические разделители.

0 голосов
/ 27 января 2019

Вы редактировали сериализованную строку вручную? URL изображения составляет 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...