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
Libérer: 2024-12-22 19:10:14
original
958 Les gens l'ont consulté

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);
Copier après la connexion

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
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal