J'ai sérialisé un chemin d'image et sauvegardé dans la base de données quand je ne suis pas sûr que cela ne fonctionne pas avec php 7.2 avant qu'il ne fonctionne avec 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;
}

Maintenant je le fais comme

$imageArr = array();

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

Et ça ne marche pas

0
arvindpundir 27 janv. 2019 à 10:58

3 réponses

Meilleure réponse

J'ai résolu cela en utilisant un correctif rapide en fonction, cette erreur était due à la modification de la longueur des données sérialisées.

$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
arvindpundir 27 janv. 2019 à 10:53

Avez-vous modifié la chaîne sérialisée manuellement? L'URL de l'image est de 76 caractères mais dans votre chaîne sérialisée indique 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'];

Au fait, ce sont les fonctions de WordPress Core. Le @ avant unserialize supprime l'avertissement. Vous pouvez utiliser unserialize() directement sans @ avec votre chaîne sérialisée d'origine et obtenir:

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

Exemple de 3v4l:

https://3v4l.org/3NWlD

0
cn7r66 27 janv. 2019 à 08:20

Si vous utilisez souvent des expressions régulières, vous pouvez utiliser l 'outil T-Regx:

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

Il a des délimiteurs automatiques.

0
Danon 30 janv. 2019 à 13:24