ホームページ >データベース >mysql チュートリアル >シリアル化された PHP 文字列のバイト カウント長が正しくないことが原因で発生する「unserialize(): Error at offset」を修正する方法

シリアル化された PHP 文字列のバイト カウント長が正しくないことが原因で発生する「unserialize(): Error at offset」を修正する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-22 19:10:14921ブラウズ

How to Fix

バイト カウントの長さが正しくないために破損したシリアル化された文字列を修正する方法

エラー「unserialize() [function.unserialize」 ]: Error at offset」は、破損したシリアル化されたファイルを操作するときによく発生します文字列。この場合、問題はバイト カウントの長さが間違っていることが原因です。

問題の理解

PHP はデータをシリアル化するときに、シリアル化された各要素の長さを接頭語。この長さが不正確な場合、PHP は文字列を正しく逆シリアル化できません。

クイック フィックス

この問題に対処するには、次を使用してシリアル化された配列内の各要素の長さを再計算します。次のコード:

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

例:

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

var_dump(unserialize($data)); // Error
var_dump(unserialize($recalculated_data)); // Correctly serialized

推奨事項:

クイックフィックスに頼るのではなく、コードを次のように更新することが重要です:

  • 単一の使用パス区切り文字との競合を防ぐために、文字列値を二重引用符ではなく引用符で囲みます。
  • シリアル化されたデータをデータベースに保存し、シリアル化を解除する前にデコードする前に、base64 エンコードを使用することを検討してください。
  • 逆シリアル化前のシリアル化された文字列の整合性 (例で提供)

検証関数:

function findSerializeError($data1)
{
    $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1);
    $max = max(strlen($data1), strlen($data2));

    for ($i = 0; $i < $max; $i++) {
        if (@$data1[$i] !== @$data2[$i]) {
            return "Error at offset $i";
        }
    }

    return true;
}

以上がシリアル化された PHP 文字列のバイト カウント長が正しくないことが原因で発生する「unserialize(): Error at offset」を修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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