PHP unserialize()でエラー
「unserialize(): Error at offset 5 of 36 bytes」というエラーがでてきた
作成日:2021-10-03, 更新日:2021-10-03
経緯
・FuelPHPを使っている
・ユーザー情報の「profile_fields」からデータを取り出すために「unserialize()」をしたらエラー
▼「unserialize()」をしたときのエラー
Fuel\Core\PhpErrorException [ Notice ]: unserialize(): Error at offset 5 of 36 bytes
対応
方法はいくつかあるが・・・私の場合
$profile_fields = unserialize(html_entity_decode($user['profile_fields']));
・・・フレームワーク特有の文字をどっかでエンコードしているのが原因かな?
今までに「unserialize()」を使ってきたのに初のエラー・・・。PHPのバージョンとかも関係あるのか・・・詳細不明
他の対応
FuelPHPに限らず「unserialize()」のエラー回避はいくつかあるっぽい
base64_decode()
$profile_fields = unserialize(base64_decode($user['profile_fields']));
trim()
$profile_fields = unserialize(trim($user['profile_fields']));
置換
$data1= preg_replace('!s:(d+):"(.*?)";!e', "'s:'.strlen('$2').':"$2";'", $user['profile_fields']); $profile_fields = unserialize($data1);
$data2 = preg_replace('/;n;/', ';N;', $user['profile_fields']); $profile_fields = unserialize($data2);
$data3 = preg_replace_callback('!s:(\d+):"([\s\S]*?)";!', function($m) { return 's:' . strlen($m[2]) . ':"' . $m[2] . '";'; }, $user['profile_fields']); $profile_fields = unserialize($data3);
UTF8にエンコード
$profile_fields = unserialize(utf8_encode($user['profile_fields']));
stripslashes()
$profile_fields = unserialize(stripslashes($user['profile_fields']));
html_entity_decode()
今回の私の場合
$profile_fields = unserialize(html_entity_decode($user['profile_fields']));