ホームページ > バックエンド開発 > PHPチュートリアル > PHP シリアル化文字列の「unserialize(): オフセットでのエラー」を修正する方法?

PHP シリアル化文字列の「unserialize(): オフセットでのエラー」を修正する方法?

DDD
リリース: 2024-12-08 12:51:11
オリジナル
392 人が閲覧しました

How to Fix

無効なバイト カウント長で破損したシリアル化された文字列を修復する方法

はじめに

シリアル化されたデータを扱う場合、次のようなエラーが発生する可能性があります。 「unserialize() [function.unserialize]: オフセットでエラーが発生しました。」このエラーは通常、バイト カウントの長さが正しくないことによる無効なシリアル化データが原因で発生します。

エラーが発生する理由

シリアル化中、PHP は strlen( ) 関数。ただし、データに特殊な処理 (エスケープなど) が必要な二重引用符などの文字が含まれている場合、バイト数が正しくなくなる可能性があります。

クイック修正

このエラーに対処するには、シリアル化された配列内の各要素の長さを手動で再計算する必要があります:

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
ログイン後にコピー

推奨アプローチ

簡単な修正に加えて、不正なシリアル化の原因を特定することが重要です。次の手順を検討してください。

  • 二重引用符 (") が適切にエスケープされていることを確認します。たとえば、一重引用符 (') を使用します。
  • データに UTF-8 文字が含まれている場合は、次のようにします。 array_map("utf8_encode", $data) を使用して、シリアル化前にエンコードします。
  • シリアル化されたデータを変換するには、base64 エンコードを使用します。データベースに保存する前に安全な形式に変換してください:
$toDatabase = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting saved format
ログイン後にコピー

シリアル化されたデータのエラーの検出

エラー メッセージは問題の一般的な兆候を示していますが、多くの場合、次の点に役立ちます。破損したデータの正確な場所を特定するには、findSerializeError 関数を使用します。この関数は、2 つのシリアル化された文字列を比較し、誤ったものを含むそれらの違いを特定します。バイト数:

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

この関数は、エラーに関する詳細情報を提供することで、シリアル化の問題の特定と解決に役立ちます。

以上がPHP シリアル化文字列の「unserialize(): オフセットでのエラー」を修正する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート