如何在 Codeigniter 中设置会话(附示例)

CodeIgniter 会话管理

如果您之前开发过桌面应用程序,那么您可能知道可以定义一个全局变量并为其分配一个值,并在应用程序的整个生命周期中使用它,打开和关闭多个(1),并且每个请求都可以访问该全局变量。

换句话说,应用程序的状态是保持不变的。也就是说,如果您在登录时将公司名称设置为全局变量,那么即使您关闭登录表单,公司名称的状态也会保留。

HTTP 的工作方式与我们刚刚描述的上述场景略有不同。它是无状态的。也就是说,你在一个请求中所做的任何事情都不会在下一个请求中持续存在。

解决这个问题。我们在 PHP 中有两个 (2) 个解决方案。我们可以使用放置在用户计算机上的小文件 cookie,也可以使用与 cookie 类似但存储在服务器上且容量比 cookie 更大的会话。

何时使用会话?

当您想要了解用户在各个页面的活动时,会话通常很有用。例如,假设您在网站上有一个受保护的区域。用户不需要在每个页面上登录。您可以让用户登录一次并将其详细信息存储在会话变量中,然后在后续请求中重复使用相同的数据。其他用例包括在购物系统上工作时,用户必须将商品添加到购物车中。

另外,CodeIgniter 还使用会话使数据在下一次请求时仅可用一次。如果您可能编辑和更新了数据库记录,并且希望在用户重定向到另一个页面时向他们返回一些反馈,那么这很有用。

使用 CI 会话向其他页面发送 Flash 消息

在本节中,您将了解如何使用会话库向其他页面发送 Flash 消息

在中创建一个新文件 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 消息方法,该方法设置 flash 数据然后重定向到 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 的键检索会话数据的值,并将其显示在浏览器中。

现在让我们为会话 flash 方法创建路由

打开 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'] = 'sessioncontroller/login'; 定义显示登录表单的路由
  • $route['authenticate'] = 'sessioncontroller/authenticate';定义模拟用户登录成功并设置会话登录数据的路由。
  • $route['settings'] = 'sessioncontroller/settings'; 定义一个受保护的页面,只有登录用户才能访问
  • $route['dashboard'] = 'sessioncontroller/dashboard'; 定义一个受保护的页面,只有登录的用户才能访问。
  • $route['logout'] = 'sessioncontroller/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) {…} 定义检查用户是否已登录然后允许访问页面的方法。如果用户未登录,则用户将通过 flash 消息重定向到登录页面。
  • public function login() {…} 加载位于会话目录中的登录视图。
  • public function authenticate() {…} 为键logged_in和username设置会话用户数据。注意:我们不针对数据库验证任何登录详细信息。我们只是假设提交的详细信息正确无误并设置会话数据。
  • public function dashed_dashboard() {…} 在调用 $this->check_auth('dashboard'); 后加载仪表板页面,以验证是否设置了 logstash_in 会话密钥。
  • public function settings() {…} 加载同样受保护的设置页面
  • public function logout() {…} 销毁会话数据并注销用户。该方法还会重定向到登录页面

CodeIgniter 会话视图

在 application/views/sessions 中创建以下视图

  • 仪表盘.php
  • 的login.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 会话库的基础知识,并学习了如何使用它将时间数据存储为闪存消息以及如何存储更永久的数据,即用户登录数据。