PHP: unserialize実行時にエラーが発生する場合の対処例

データベースから取り出したシリアライズされたデータに対して、unserialize 関数を実行したところ、エラーが発生しました。

Fatal error: Uncaught ErrorException: unserialize(): Error at offset 0 of 8 bytes

どうやら、シリアライズされたデータの『文字列長』が何らかの原因で誤っていたため発生したようです。文字列長とは、下記の擬似コードの『s:4』の部分です。

$data = 's:4:"abc"';

対策例

シリアライズされたデータの『文字列長を再計算』し、『文字列長を置換』したところ、unserialize を通すことができました。文字列長は改行コードを含めて計算しています。

$data = 's:4:"abc"';

// 文字列長を再計算して、s:xxxを置換
$data = preg_replace_callback('!s:(\d+):"([\s\S]*?)";!', function($m) {
  return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
}, $data);

echo $data; // => 's:3:"abc"'

$text = unserialize($data);

参考サイト

以上です。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください