Maison >base de données >tutoriel mysql >Comment réparer « unserialize() : erreur de décalage » provoquée par une longueur incorrecte du nombre d'octets dans les chaînes PHP sérialisées ?
Comment réparer une chaîne sérialisée corrompue en raison d'une longueur incorrecte du nombre d'octets
L'erreur "unserialize() [function.unserialize ] : Erreur à l'offset" survient souvent lorsque vous travaillez avec des chaînes sérialisées corrompues. Dans ce cas, le problème provient d'une longueur incorrecte du nombre d'octets.
Comprendre le problème
Lorsque PHP sérialise les données, il stocke la longueur de chaque élément sérialisé sous forme de préfixe. Si cette longueur est inexacte, PHP ne parvient pas à désérialiser correctement la chaîne.
Correction rapide
Pour résoudre ce problème, recalculez la longueur de chaque élément du tableau sérialisé à l'aide de ce qui suit code :
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
Exemple :
$data = 'a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15:"submit_comments";s:4:"open";s:5:"image";s:19:"C:\fakepath0.jpg;"}'; var_dump(unserialize($data)); // Error var_dump(unserialize($recalculated_data)); // Correctly serialized
Recommandations :
Au lieu de s'appuyer sur des solutions rapides, il est Il est crucial de mettre à jour votre code pour :
Validation Fonction :
function findSerializeError($data1) { $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1); $max = max(strlen($data1), strlen($data2)); for ($i = 0; $i < $max; $i++) { if (@$data1[$i] !== @$data2[$i]) { return "Error at offset $i"; } } return true; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!