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 « unserialize() : erreur de décalage » provoquée par une longueur incorrecte du nombre d'octets dans les chaînes PHP sérialisées ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-22 19:10:14922parcourir

How to Fix

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 :

  • Utilisez des guillemets simples pour les valeurs de chaîne au lieu de guillemets doubles pour éviter les conflits avec les séparateurs de chemin.
  • Envisagez d'utiliser le codage base64 avant d'enregistrer les données sérialisées dans la base de données et de les décoder avant la désérialisation.
  • Incluez une fonction pour valider l'intégrité des chaînes sérialisées avant la désérialisation. (fourni dans l'exemple ci-dessous).

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn