Maison >base de données >tutoriel mysql >Comment puis-je corriger les erreurs « unserialize() : Error at offset » dans les chaînes sérialisées corrompues ?

Comment puis-je corriger les erreurs « unserialize() : Error at offset » dans les chaînes sérialisées corrompues ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-14 06:28:14775parcourir

How Can I Fix

Réparation des chaînes sérialisées corrompues : résolution des erreurs de nombre d'octets non valides

Problème :

Vous rencontrez l'erreur "unserialize( ) [function.unserialize] : Erreur à l'offset" lors de la tentative de désérialisation d'un fichier sérialisé corrompu chaîne. Cette erreur indique que la chaîne contient des longueurs de nombre d'octets non valides, ce qui entraîne une troncature des données.

Cause :

Données de sérialisation non valides en raison d'un calcul incorrect des longueurs d'éléments.

Correction rapide :

Recalculer l'élément Longueurs : Calculez la longueur réelle de chaque élément sérialisé et mettez à jour les valeurs de nombre d'octets correspondantes.

Par exemple, considérons la chaîne sérialisée suivante :

$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:fakepath100.jpg";}';

Utilisez le code suivant pour recalculer et corriger les longueurs des éléments :

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

Assurer une citation appropriée :Utiliser un seul guillemets (') au lieu de guillemets doubles (") lors de l'attribution de valeurs aux éléments sérialisés, car ces derniers peuvent provoquer une troncature inattendue.

Précautions supplémentaires :

  • Ajoutez des barres obliques aux valeurs à l'aide de addlashes() avant de sérialiser pour empêcher les attaques par injection SQL.
  • Encodez les caractères UTF-8 à l'aide utf8_encode() pour une compatibilité multiplateforme.
  • Envisagez d'utiliser base64_encode() et base64_decode() pour un stockage de base de données plus sûr et une récupération des données sérialisées.

Détecter les erreurs de sérialisation dans l'avenir :

La fonction suivante peut être utilisée pour identifier les différences de longueur des éléments et aider à localiser la source de la corruption :

function findSerializeError($data1) {
    // ... (code omitted for brevity)
}

En utilisant cette fonction, vous pouvez analyser les données corrompues, identifier l'élément problématique et le corriger en conséquence.

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