当我取消序列化它在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));
及其不起作用
答案 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中的示例:
答案 2 :(得分:0)
如果您经常使用正则表达式,则可以使用T-Regx tool:
pattern('s:(\d+):"(.*?)";')->replace($original)->callback(function(Match $m) {
return 's:' . $m->group(2)->length() . ':"' . $m->group(2) . '";';
});
它具有自动定界符。