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
Libérer: 2024-12-14 06:28:14
original
680 Les gens l'ont consulté

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

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

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

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

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!

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