ラボ > PHP:各種エラー、FuelPHP:auth関連、エラー絡み

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']));