テレットブログ

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

conoha vps で postfix にDKIMをセットする

2025年06月02日
# メールサーバー設定作業レポート ## 1. 作業概要 ConoHa
Read more →
image

shopipyのページネーションについて

2023年11月15日
Shopify APIのレスポンスヘッダーには、ページネーションに関す
Read more →
image

Git-ftpを使ったファイルアップロードの方法

2023年04月20日
タイトル: Git-ftpを使ったファイルアップロードの方法 概要
Read more →
image

ChatGPTとjQueryの組み合わせで新しい時代のウェブ開発をリード

2023年04月19日
近年、AI技術がウェブ開発の分野においても急速に浸透しています。特に、ChatG
Read more →
image

ChatGPTで日本語をマスター!次世代AI技術を活用したコミュニケーションの強化

2023年04月18日
ChatGPTは、OpenAIが開発した最先端のAI技術であり、自然言語処理(N
Read more →
Choose Colour