データベースから取り出したシリアライズされたデータに対して、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);
参考サイト
- https://teratail.com/questions/5624
- https://helog.jp/php/unserialize-error/
- https://stackoverflow.com/questions/35279603/php-converting-preg-replace-to-preg-replace-callback
- https://bugs.php.net/bug.php?id=45573
以上です。