【FuelPHP】Notice: unserialize() [function.unserialize]: Error at offset 23 of 34 bytesとか出てくるとき

公開: 2013-09-16 13:51
更新: 2016-04-29 06:02
別にFuelPHPに限った話ではないんですが、
SerializeしてUnserialize出来ないないなんてパターンが存在するんですよね。

ただ、FuelPHPのSimpleAuthってな便利なものがあるんですけど、
profile_fieldsっていうカラムにユーザーの他愛無い情報とかをserializeして入れるんです。

するとたまにunserialize出来ないなんてことが起きます。

とりあえずあっきぃ(@appstars_aki)さんが調べたところ
絵文字(スマホとかであるやつ)とかなんか見たこともない漢字を入れるとバグってしまうみたいです。
おそらくprofile_fieldsをutf8_unicode_ciにしてるからかしら?

そんなわけでその対処法としては
値をbase64_encodeしてあげる。って感じです。

たとえばこんな関数を用意
//配列の中をbase64_encodeしてあげる
function base64_encode_array($data = array())
        foreach($data as $key => $val) {
                if(is_array($val)) {
                        $val = base64_encode_array($val);
                } else {
                        $val = base64_encode($val);
                }
                $data[$key] = $val;
        }
        return $data;
}
//配列の中をbase64_decodeしてあげる
function base64_decode_array($data = array())
        foreach($data as $key => $val) {
                if(is_array($val)) {
                        $val = base64_decode_array($val);
                } else {
                        $val = base64_decode($val);
                }
                $data[$key] = $val;
        }
        return $data;
}

//serializeされたデータを配列にしbase64_decodeしてあげる
function unserialize_string($string)
        $data = unserialize($string);
        return base64_decode_array($data);
}

別にserializeしたものをbase64_encodeしてあげればいいんですけど。
FuelPHPのSimpleAuthだとPackageの中をいじるのはちょいと嫌なので、渡す前と読み込んだ後にそれぞれこの関数呼んであげればOK。

とりあえずこれでどんな文字が来ても大丈夫♪(なはず...

参考になれば幸いです♪
ではでは♪

この記事をシェア
この記事にコメントする
書き込む
あっきぃ(@appstars_aki)
Web、iOSなフリーランサーです。好きなものはお寿司です。でもお寿司は高いので普段は雑草とか拾ったドングリを食べています。お仕事や意味もなく毎月お小遣いをくれる人を探してます。

お仕事の依頼や自分で作ったアプリのレビューを希望しちゃう方はaki@appstars.jpまでご連絡ください。