Maison >développement back-end >tutoriel php >Comment réparer « unserialize() : erreur lors du décalage » dans les chaînes sérialisées PHP ?

Comment réparer « unserialize() : erreur lors du décalage » dans les chaînes sérialisées PHP ?

DDD
DDDoriginal
2024-12-08 12:51:11388parcourir

How to Fix

Comment réparer une chaîne sérialisée corrompue avec une longueur de nombre d'octets invalide

Introduction

Lorsque vous traitez des données sérialisées, il est possible de rencontrer une erreur indiquant "unserialize() [function.unserialize] : Erreur au décalage." Cette erreur se produit généralement en raison de données de sérialisation non valides causées par une longueur de nombre d'octets incorrecte.

Pourquoi l'erreur se produit

Pendant la sérialisation, PHP calcule la longueur de chaque élément du tableau sérialisé à l'aide du strlen( ) fonction. Toutefois, si les données contiennent des caractères, tels que des guillemets doubles, qui nécessitent un traitement spécial (par exemple, une fuite), le nombre d'octets peut devenir incorrect.

Correction rapide

Pour résoudre cette erreur, il est nécessaire de recalculer manuellement la longueur de chaque élément du tableau sérialisé :

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);

Recommandé Approche

En plus de la solution rapide, il est important d'identifier la cause de la sérialisation incorrecte. Considérez les étapes suivantes :

  • Assurez-vous que les guillemets doubles (") sont correctement échappés, par exemple, utilisez des guillemets simples (').
  • Si les données contiennent des caractères UTF-8, utilisez array_map("utf8_encode", $data) pour les encoder avant la sérialisation.
  • Utilisez l'encodage base64 pour convertir les données sérialisées en un format sécurisé avant de le stocker dans la base de données :
$toDatabase = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting saved format

Détection des erreurs dans les données sérialisées

Bien que le message d'erreur fournisse une indication générale du problème, il est souvent utile d'identifier le emplacement exact des données corrompues. Pour ce faire, utilisez la fonction findSerializeError, qui compare deux chaînes sérialisées et identifie les différences entre elles, y compris l'octet incorrect. compte :

function findSerializeError($data1) {
    echo "<pre class="brush:php;toolbar:false">";
    $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1);
    // ...
}

En fournissant des informations détaillées sur l'erreur, cette fonction aide à identifier et à résoudre les problèmes de sérialisation.

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