ホームページ >データベース >mysql チュートリアル >シリアル化された PHP 文字列のバイト カウント長が正しくないことが原因で発生する「unserialize(): Error at offset」を修正する方法
バイト カウントの長さが正しくないために破損したシリアル化された文字列を修正する方法
エラー「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
推奨事項:
クイックフィックスに頼るのではなく、コードを次のように更新することが重要です:
検証関数:
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 サイトの他の関連記事を参照してください。