ホームページ >データベース >mysql チュートリアル >破損したシリアル化された文字列の「unserialize(): Error at offset」エラーを修正するにはどうすればよいですか?

破損したシリアル化された文字列の「unserialize(): Error at offset」エラーを修正するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-14 06:28:14685ブラウズ

How Can I Fix

破損したシリアル化された文字列の修復: 無効なバイト数エラーの解決

問題:

エラー「unserialize( ) [function.unserialize]: 試行時にオフセットでエラーが発生しました破損したシリアル化された文字列をシリアル化解除します。このエラーは、文字列に無効なバイト カウント長が含まれているため、データが切り捨てられていることを示します。

原因:

要素の長さの計算が正しくないため、シリアル化データが無効です。

クイック修正:

要素の長さの再計算: 各シリアル化された要素の実際の長さを計算し、対応するバイト カウント値を更新します。

たとえば、次のシリアル化された要素について考えてみましょう。 string:

$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";}';

次のコードを使用して要素を再計算して修正しますlength:

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

適切な引用符を確保する: シリアル化された要素に値を割り当てるときは、二重引用符 (") ではなく一重引用符 (') を使用します。後者は予期しない切り捨てを引き起こす可能性があります。

追加注意事項:

  • SQL インジェクション攻撃を防ぐために、シリアル化する前に addlashes() を使用して値にスラッシュを追加します。
  • クロスプラットフォーム互換性のために utf8_encode() を使用して UTF-8 文字をエンコードします。 .
  • base64_encode() とbase64_decode() の使用を検討してください。データベースの保存とシリアル化されたデータの取得がより安全になります。

今後のシリアル化エラーの検出:

次の関数を使用して、要素の長さの違いを識別し、ヘルプを得ることができます。破損の原因を特定します:

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

この機能を使用すると、破損したデータを分析し、特定することができます。問題のある要素を見つけて、それに応じて修正してください。

以上が破損したシリアル化された文字列の「unserialize(): Error at offset」エラーを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。