Codeigniter でセッションを設定する方法と例

CodeIgniter セッション管理

それまでにデスクトップ アプリケーションを開発したことがある場合は、グローバル変数を定義してそれに値を割り当て、複数のアプリケーションを開いたり閉じたりするライフ サイクル全体にわたってその変数を使用し、各リクエストが次の変数にアクセスできることをご存知でしょう。グローバル変数。

つまり、アプリケーションの状態は維持されます。 つまり、ログイン時に会社名をグローバル変数に設定した場合、ログイン フォームを閉じた後でも会社名の状態は保持されます。

HTTP は、先ほど説明した上記のシナリオとは少し異なります。 無国籍です。 つまり、XNUMX つのリクエストで何をしても、次のリクエストでは持続されません。 T

o この問題を回避します。 PHP には 2 つのソリューションがあります。 ユーザーのコンピュータに配置される小さなファイルである Cookie を使用することも、Cookie に似ているがサーバーに保存され、Cookie よりも容量が大きいセッションを使用することもできます。

セッションをいつ使用するか?

セッションは通常、ページ間のユーザーのアクティビティを知りたいときに役立ちます。たとえば、Web サイトに保護された領域があるとします。ユーザーは各ページでログインする必要はありません。ユーザーに一度ログインさせ、詳細をセッション変数に保存して、それ以降のリクエストで同じデータを再利用することができます。その他の使用例としては、ショッピング システムで作業していて、ユーザーがショッピング カートにアイテムを追加する必要がある場合などがあります。

あるいは、CodeIgniter はセッションを使用して、次のリクエストで XNUMX 回だけデータを利用できるようにします。 これは、データベース レコードを編集および更新する場合や、ユーザーが別のページにリダイレクトされたときにユーザーにフィードバックを返したい場合に便利です。

CI セッションを使用して他のページに Flash メッセージを送信する

このセクションでは、セッション ライブラリを使用して他のページに Flash メッセージを送信する方法を学習します。 CodeIgniter

新しいファイルSessionControllerを作成します

application/controllers/SessionController.php

次のコードを追加します

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class SessionController extends CI_Controller {

    public function __construct() {
        parent:: __construct();

        $this->load->helper('url');
        $this->load->library('session');
    }

    public function index() {
        
        $this->load->view('sessions/index');
    }
    
    public function flash_message(){
        $this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages');
        redirect(base_url('flash_index'));
    }
}

ここに、

  • class SessionController extends CI_Controller {…} SessionController クラスを定義し、親コントローラー クラスを拡張します。
  • public function __construct() {…} は、親クラスを初期化し、URL ヘルパーとセッション ライブラリをロードするコンストラクター メソッドを定義します。
  • public function Index() {…} は、セッション インデックス ビューをロードするセッション インデックス メソッドを定義します。
  • public function flash_message(){…} は、フラッシュ データを設定して flash_index ルートにリダイレクトするフラッシュ メッセージ メソッドを定義します。

次に、セッション データの値を表示するビューを作成しましょう。

application/viewsに新しいディレクトリセッションを作成します。

application/views/sessions に新しいファイルindex.phpを作成します。

次のコードを追加します

<html>
    <head>
        <title>Code Igniter Flash Session</title>
    </head>
    <body>
        <p>The session value of msg is <b> <?=$this->session->userdata('msg');?> </b></p>
    </body>
</html>

ここに、

session->userdata('msg');?> は、msg をキーとしてセッション データの値を取得し、ブラウザに表示します。

次に、セッション フラッシュ メソッドのルートを作成しましょう。

application/config/routes.php を開きます

次の行を追加します

$route['flash_index'] = 'session controller';
$route['flash_message'] = 'session controller/flash_message';

組み込みサーバーを起動しましょう PHP フラッシュメッセージをテストしてください

ターミナルを開く

次のコマンドを実行します

cd C:\Sites\ci-app
php -S localhost:3000

ここに、

上記のコマンドは、アプリケーション コード ディレクトリを参照し、ポート 3000 で組み込みサーバーを起動します。

注: アプリケーションのパスは CodeIgniter をダウンロードしたパスと一致する必要があり、コンピューター上で空いている任意のポート番号を使用できます。 ポート 3000 を使用する必要はありません。

Web ブラウザに次の URL を読み込みます。 http://localhost:3000/flash_message

次の URL にリダイレクトされ、次の結果が得られます。 http://localhost:3000/flash_index

Flash メッセージを他のページに送信する

Web ブラウザの更新ボタンをクリックするか、F5 キーを押します。

次の結果が得られます

Flash メッセージを他のページに送信する

CI セッションでのユーザー データの保存

次に、もう少し高度な例を見てみましょう。 簡単にするために、ユーザー認証をシミュレートし、データベース内のユーザー レコードと送信されたパスワードを検証する実際の実装は行いません。

まずはルートから始めましょう

application/configにあるroutes.phpを開きます

次のルートを追加します

$route['login'] = 'sessioncontroller/login';
$route['authenticate'] = 'sessioncontroller/authenticate';
$route['settings'] = 'sessioncontroller/settings';
$route['dashboard'] = 'sessioncontroller/dashboard';
$route['logout'] = 'sessioncontroller/logout';

ここに、

  • $route['login'] = 'セッションコントローラー/ログイン'; ログインフォームを表示するルートを定義します
  • $route['authenticate'] = 'セッションコントローラー/認証'; 成功したユーザー ログインをシミュレートするルートを定義し、セッション ログイン データを設定します。
  • $route['設定'] = 'セッションコントローラー/設定'; ログインしているユーザーのみがアクセスできる保護されたページを定義します
  • $route['ダッシュボード'] = 'セッションコントローラー/ダッシュボード'; ログインしているユーザーのみがアクセスできる保護されたページを定義します。
  • $route['logout'] = 'セッションコントローラー/ログアウト'; セッションデータを破棄してユーザーをログアウトします

次に、SessionControllerを更新しましょう

application/controllers/SessionController.php を開きます

以下のメソッドを追加します

public function check_auth($page) {
        if (!$this->session->userdata('logged_in')) {
            $this->session->set_flashdata('msg', "You need to be logged in to access the $page page.");
            redirect('login');
        }
    }

    public function login() {
        $this->load->view('sessions/login');
    }

    public function authenticate() {
        $this->session->set_userdata('username', 'John Doe');
        $this->session->set_userdata('logged_in', TRUE);
        redirect(base_url('dashboard'));
    }

    public function dashboard() {
        $this->check_auth('dashboard');
        $this->load->view('sessions/dashboard');
    }

    public function settings() {
        $this->check_auth('settings');
        $this->load->view('sessions/settings');
    }

    public function logout() {
        $this->session->unset_userdata('username');
        $this->session->unset_userdata('logged_in');
        redirect(base_url('login'));
    }

ここに、

  • public function check_auth($page) {…} は、ユーザーがログインしているかどうかを確認してページへのアクセスを許可するメソッドを定義します。 ユーザーがログインしていない場合、ユーザーはフラッシュ メッセージとともにログイン ページにリダイレクトされます。
  • public function login() {…} は、セッション ディレクトリにあるログイン ビューを読み込みます。
  • public function authenticate() {…} は、logged_in および username キーのセッション ユーザー データを設定します。注: データベースに対してログイン詳細を検証していません。送信された詳細が適切であると仮定して、セッション データを設定するだけです。
  • public functiondashboard() {…} $this->check_auth('dashboard'); を呼び出した後、ダッシュボード ページを読み込みます。 これにより、logged_in セッション キーが設定されていることを確認します。
  • public function settings() {…} も保護されている設定ページをロードします
  • public function logout() {…} はセッション データを破棄し、ユーザーをサインアウトします。 このメソッドはログイン ページにもリダイレクトします。

CodeIgniter セッション ビュー

application/views/sessionsに次のビューを作成します。

  • Dashboard.php
  • ログイン.php
  • settings.php

dashboard.phpに次のコードを追加します。

<!DOCTYPE html>
<html>
    <head>
        <title>Dashboard</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <nav class="navbar" role="navigation" aria-label="main navigation">
                    <div id="navbarBasicExample" class="navbar-menu">
                        <div class="navbar-start">
                            <a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a>
                            <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
                        </div>

                        <div class="navbar-end">
                            <div class="navbar-item has-dropdown is-hoverable">
                                <a class="navbar-link"><?=$this->session->userdata('username');?></a>

                                <div class="navbar-dropdown">
                                    <a class="navbar-item">My Profile</a>
                                    <hr class="navbar-divider">
                                    <a class="navbar-item">Sign out</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </nav>
                <h3>Welcome Page</h3>
            </div>
        </div>
    </body>
</html>

ここに、

session->userdata('username');?> 認証方法で設定したユーザー名が表示されます

login.phpに次のコードを追加します。

<!DOCTYPE html>
<html>
    <head>
        <title>Login</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <p><?=$this->session->userdata('msg');?></p>
                <form method="post" action="<?= site_url('authenticate')?>">
                    <div class="field">
                        <label class="label">Username</label>
                        <div class="control">
                            <input class="input" type="text" placeholder="Text input">
                        </div>
                    </div>
                    <div class="field">
                        <label class="label">Password</label>
                        <div class="control">
                            <input class="input" type="passport" placeholder="Text input">
                        </div>
                    </div>
                    <div class="field is-grouped">
                        <div class="control">
                            <button class="button is-success">Login</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </body>
</html>

ここに、

ログイン フォームを送信してルートを認証します。

次のコードをsettings.phpに追加します。

<!DOCTYPE html>
<html>
    <head>
        <title>Settings</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
    </head>
    <body>
        <div class="container">
            <div class="column">
                <nav class="navbar" role="navigation" aria-label="main navigation">
                    <div id="navbarBasicExample" class="navbar-menu">
                        <div class="navbar-start">
                            <a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a>
                            <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
                        </div>

                        <div class="navbar-end">
                            <div class="navbar-item has-dropdown is-hoverable">
                                <a class="navbar-link">Jim Jones</a>

                                <div class="navbar-dropdown">
                                    <a href="#" class="navbar-item">My Profile</a>
                                    <hr class="navbar-divider">
                                    <a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </nav>
                <h3>Settings Page</h3>
            </div>
        </div>
    </body>
</html>

私たちの見解は以上です。 それではアプリケーションをテストしてみましょう。

このチュートリアルでは、組み込みの PHP Web サーバーを使用していますが、PHP をサポートする任意の Web サーバーを使用できます。

ターミナルを開く

次のコマンドを実行します

cd C:\Sites\ci-app
php -S localhost:3000

ここに、

上記のコマンドは、アプリケーション コード ディレクトリを参照し、ポート 3000 で組み込みサーバーを起動します。

注: アプリケーションのパスは CodeIgniter をダウンロードしたパスと一致する必要があり、コンピューター上で空いている任意のポート番号を使用できます。 ポート 3000 を使用する必要はありません。

Web ブラウザで次の URL を開きます。 http://localhost:3000/dashboard

次のページにリダイレクトされます

CodeIgniter セッション ビュー

ログインボタンをクリック

以下の結果が表示されます

CodeIgniter セッション ビュー

ログインすると、セッション データを確認できるようになります。

まとめ

このチュートリアルでは、CodeIgniter セッション ライブラリの基本を学習し、それを使用して一時データをフラッシュ メッセージとして保存する方法と、より永続的なデータ (ユーザー ログイン データなど) を保存する方法を学習しました。