テレットブログ

Codeigniter3 PHP8環境だとセッションflashdataが消えない

2021年10月01日
image
CodeIgniterは、PHPのフレームワークであり、非常に簡単で快速で、Webアプリケーションを提供するために必要なものが揃っていてる。
codeigniter 3は、現在のPHPバージョンからPHP 8への移行に対応しているのでしょうか?

この日、私はPHP 8をインストールし、CodeIgniter3アプリを作成してみました。
ほぼほぼCI 3は、PHP 8.0に対応し問題なく動くのですが、PHP 8.0には対応していない問題が発生しました。

 1)CI 3のフラッシュデータは、更新時やリダイレクト利用時に成功や失敗とアラートを表示させたりし、ベージ遷移時にはそのアラートは表示されず消えるのが本来の利用方法です。がPHP8の環境下だとページを遷移してもアラートは表示され消える事がない事象が発生しました。これはPHP8の環境下だと発生する問題です。

いつくかのサイトを巡回し解読できましたので記載しておきます。
※今回はCi3のsystemファイル(コアファイル)を修正しますので、自己判断にてご利用して下さい。

system\libraries\SessionSession.php 418行目から423行目まで。
// Hacky, but 'old' will (implicitly) always be less than time() ;)
// 「new」チェックの上に移動させないでください。
elseif ($value < $current_time)
{
    unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);
}

この記載部分
本来の時間とフラッシュの時間を比較して、その時間とフラッシュの時間が一致しているかどうかを確認しています。
PHP バージョン 7.4 以降では、"Old" == <Numeric> が True となり、"Old" < 数値ではないが変更可能なもの> が True となりますが、PHP 8 では 文字列を文字列に変換する際に問題が発生します。

https://wiki.php.net/rfc/string_to_number_comparison

そのため、以下のような方法で修正 

// Hacky, but 'old' will (implicitly) always be less than time() ;)
// 「new」チェックの上に移動させないでください。
elseif ($value === 'old' || $value < $current_time)
{
    unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);
]

※今回はCi3のsystemファイル(コアファイル)を修正しますので、自己判断にてご利用して下さい。
 


新着記事

image

CodeIgniter3でリダイレクトでセッション消える Part2

2021年10月07日
前回の記事でセキュリティ上、httpsにのみ対応する。というセッション問題解決が
Read more →
image

Codeigniter3 PHP8環境だとセッションflashdataが消えない

2021年10月01日
CodeIgniterは、PHPのフレームワークであり、非常に簡単で快速で、We
Read more →
image

CodeIgniter3でリダイレクトでセッション消える

2020年10月28日
テストサーバ(http)にて確認していると 管理画面ではセッションが空に!
Read more →
image

防衛省、サイバーセキュリティ担当の防衛技官を募集中月給30万円

2020年10月16日
 防衛省が、サイバーセキュリティに従事する防衛技官を募っている。自衛隊のシステム
Read more →
image

Amazon Echo Auto アマゾンエコーオート 開封&利用一週間レビュー

2020年10月08日
早速アマゾン・エコーオートを購入して車に取り付けて利用してみました! 報道
Read more →
Choose Colour