如何在CodeIgniter中使用会话数据

作为CodeIgniter开发人员,了解如何使用核心会话库对您而言非常重要。 当然,您始终可以使用默认的$_SESSION语法,但是始终建议使用包装器。

从如何加载会话库开始,我们将继续讨论如何添加,检索,删除和销毁会话变量。 在最后一部分中,我们将介绍CodeIgniter框架本身提供的各种内置会话驱动程序供您使用。

如何加载会话库

如果要在CodeIgniter中使用会话,则首先需要一个内置的会话库。 除非并且直到您开发一个根本不需要会话的Web应用程序,否则您不应该为会话库而烦恼。 尽管大多数情况并非如此,但是您可以在CodeIgniter中自动加载会话库,以便它为每个Web请求启用会话处理功能。

继续并打开位于application/config/autoload.php的文件。 查找以下部分。

/*
| -------------------------------------------------------------------
|  Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
|    $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
|	$autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array();

$autoload['libraries']数组包含需要自动加载的库列表。 根据我们的要求,让我们将其更改为如下所示:

$autoload['libraries'] = array('session');

此外,还有另一种方法可以实现这一目标。 您可以在控制器文件中的某处使用以下代码来加载会话库。

$this->load->library('session');

就会话库的初始化而言,仅此而已。

在接下来的两节中,我们将介绍您可以对核心会话库执行的不同操作。 为了演示它,我们将构建一个示例控制器文件,该文件加载会话库并提供将在本文中讨论的方法。

继续并使用以下内容创建文件application/controllers/Example.php

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

class Example extends CI_Controller {
    public function __construct()
    {
        parent::__construct();

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

    public function index()
    {
        /**** SET SESSION DATA ****/
        // set single item in session
        $this->session->set_userdata('favourite_website', 'https://tutsplus.com');
        
        // set array of items in session
        $arraydata = array(
                'author_name'  => 'Sajal Soni',
                'website'     => 'http://code.tutsplus.com',
                'twitter_id' => '@sajalsoni',
                'interests' => array('tennis', 'travelling')
        );
        $this->session->set_userdata($arraydata);
        
        /**** GET SESSION DATA ****/
        // get data from session
        echo "Favourite Website: ". $this->session->userdata('favourite_website');
        echo "<br>";
        echo "Author Name: ". $this->session->userdata('author_name');
        echo "<br>";
        echo "Interest (Array Example): " . $this->session->userdata('interests')[0];
        echo "<br>";
    
        // get e'thing stored in session at once
        echo '<pre>';
        print_r($this->session->userdata());
        
        /**** REMOVE SESSION DATA ****/
        // unset specific key from session
        $this->session->unset_userdata('favourite_website');
        
        // unset multiple items at once
        $keys = array('twitter_id', 'interests');
        $this->session->unset_userdata($keys);
    
        echo '<pre>';
        print_r($this->session->userdata());
    }
    
    public function setflash()
    {
        // set flash data
        $this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!');
        
        // mark existing data as flash data
        $this->session->set_userdata('flash_message', 'I am flash message!');
        $this->session->mark_as_flash('flash_message');
        
        redirect('example/getflash');
    }
    
    public function getflash() 
    {
        // get flash data
        echo "Flash welcome message: ". $this->session->flashdata('flash_welcome');
        echo '<pre>';
        print_r($this->session->flashdata());
    }

    public function tempdata() 
    {
        // set temp data
        $this->session->set_tempdata('coupon_code', 'XYEceQ!', 300);

        // mark existing data as temp data
        $this->session->set_userdata('coupon_code', 'XYEceQ!');
        $this->session->mark_as_temp('coupon_code', 300);
        
        // get temp data
        echo $this->session->tempdata('coupon_code');
    }

    public function destroy()
    {
        $this->session->set_userdata('favourite_website', 'http://tutsplus.com');
        
        // destory session
        $this->session->sess_destroy();
    }
}

作为CodeIgniter开发人员,这是一个非常基本的控制器文件。 现在,我们准备移至接下来的两节,以深入了解会话处理概念。

如何添加,检索和删除会话数据

首先,让我们获取__construct方法的代码。

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

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

以防万一您没有自动加载会话库,它将首先进行。 除此之外,我们还加载了url帮助器,使我们可以使用某些实用工具方法,我们将在以后看到。

接下来,获取index方法的代码。

public function index()
{
    /**** SET SESSION DATA ****/
    // set single item in session
    $this->session->set_userdata('favourite_website', 'http://tutsplus.com');
    
    // set array of items in session
    $arraydata = array(
            'author_name'  => 'Sajal Soni',
            'website'     => 'http://code.tutsplus.com',
            'twitter_id' => '@sajalsoni',
            'interests' => array('tennis', 'travelling')
    );
    $this->session->set_userdata($arraydata);
    
    /**** GET SESSION DATA ****/
    // get data from session
    echo "Favourite Website: ". $this->session->userdata('favourite_website');
    echo "<br>";
    echo "Author Name: ". $this->session->userdata('author_name');
    echo "<br>";
    echo "Interest (Array Example): " . $this->session->userdata('interests')[0];
    echo "<br>";

    // get e'thing stored in session at once
    echo '<pre>';
    print_r($this->session->userdata());
    
    /**** REMOVE SESSION DATA ****/
    // unset specific key from session
    $this->session->unset_userdata('favourite_website');
    
    // unset multiple items at once
    $keys = array('twitter_id', 'interests');
    $this->session->unset_userdata($keys);

    echo '<pre>';
    print_r($this->session->userdata());
}

既然已经加载了会话库,就可以使用$this->session来访问会话对象并访问所支持的方法。 set_userdata方法用于创建新的会话变量,并且通常使用两个参数-key和value。

$this->session->set_userdata('favourite_website', 'http://tutsplus.com');

您也可以使用set_userdata方法在单个调用中创建多个变量。 在这种情况下,您只需要提供一个参数,它就应该是一个数组,如下所示。

// set array of items in session
$arraydata = array(
        'author_name'  => 'Sajal Soni',
        'website'     => 'http://code.tutsplus.com',
        'twitter_id' => '@sajalsoni',
        'interests' => array('tennis', 'travelling')
);
$this->session->set_userdata($arraydata);

眼神敏锐的用户会注意到,您还可以将数组分配为任何会话变量的值,如上面的interests示例所示。

现在,让我们看看如何检索任何会话变量的值。 userdata方法用于检索任何会话变量的值,通常它需要将要查找的会话变量的键作为第一个参数。

echo "Favourite Website: ". $this->session->userdata('favourite_website');

如果要查找数组条目之一,则可以使用以下命令:

echo "Interest (Array Example): " . $this->session->userdata('interests')[0];

通常,您想知道活动会话中总共存储了多少变量以进行调试,您也可以这样做。

// get e'thing stored in session at once
echo '<pre>';
print_r($this->session->userdata());

是的,我们可以使用相同的userdata方法! 如果您没有将任何参数传递给userdata方法,它将返回所有会话变量。

最后,让我们看看如何从会话中删除变量。 如果要删除任何会话条目,可以使用unset_userdata方法。

// unset specific key from session
$this->session->unset_userdata('favourite_website');

这是相同方法的变体,它显示了如何一次性删除多个条目。

// unset multiple items at once
$keys = array('twitter_id', 'interests');
$this->session->unset_userdata($keys);

这应该从会话中删除twitter_idinterests条目。

继续并测试index方法以查看实际情况。

有用的东西:Flashdata和Tempdata

在上一节中,我们讨论了CodeIgniter中会话处理的基础。 在本节中,我们将讨论会话库提供的其他几个实用程序方法。

在日常开发中,您经常需要显示消息以响应某些用户操作。 例如,当某人在您的网站上发表评论时,您希望显示一条成功消息,并且该消息应仅显示一次。 set_flashdata方法是此类用例的理想选择。

实际上, set_flashdataset_userdata方法非常相似,因为它允许您在会话中保存值。 唯一的例外是,由flashdata方法设置的会话值仅可用于下一个请求。 在随后的请求中,您将无法再访问这些已清除的变量。

抓住setflash方法的代码。

public function setflash()
{
    // set flash data
    $this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!');
    
    // mark existing data as flash data
    $this->session->set_userdata('flash_message', 'I am flash message!');
    $this->session->mark_as_flash('flash_message');
    
    redirect('example/getflash');
}

您可以使用与使用set_userdata方法创建常规会话变量相同的方式来创建新的flashdata变量。 另一方面,您也可以将现有的会话变量标记为flashdata变量。 在这种情况下,您需要使用mark_as_flash方法,如上面的代码所示。

最后,我们将用户重定向到getflash方法,该方法显示了如何使用在setflash方法中设置的flashdata变量。 让我们快速看一下getflash方法。

public function getflash() 
{
    // get flash data
    echo "Flash welcome message: ". $this->session->flashdata('flash_welcome');
    echo '<pre>';
    print_r($this->session->flashdata());
}

与预期的一样,有一个flashdata方法,允许您获取存储为flashdata的会话变量。 如果不带任何参数调用flashdata方法,它将返回所有与userdata方法相似的flashdata变量。

继续并测试setflash方法。 您将被重定向到getflash URL,并且您会看到消息。 如果刷新getflash页面,将不再看到该消息!

接下来,会话库在此类别中提供了另一个变体-tempdata会话变量。 如果要在特定时间段内创建会话变量,则可以使用set_tempdata方法。

例如,如果要创建一个会话变量,该变量在一定时间段后应自动删除,则可以使用set_tempdata方法创建这样的变量,如以下方法所示。

public function tempdata() 
{
    // set temp data
    $this->session->set_tempdata('coupon_code', 'XYEceQ!', 300);

    // mark existing data as temp data
    $this->session->set_userdata('coupon_code', 'XYEceQ!');
    $this->session->mark_as_temp('coupon_code', 300);
    
    // get temp data
    echo $this->session->tempdata('coupon_code');
}

set_tempdata方法中的第三个参数指示将从会话中删除变量的秒数。

您还可以使用mark_as_temp方法将现有会话变量标记为mark_as_temp前提是您已经使用set_userdata方法创建了会话变量。

最后,您可以使用tempdata方法来获取任何tempdata变量的值。

因此,在您的日常开发生命周期中拥有这样的实用程序方法是很好的选择!

您不应该忘记的事情:会话破坏

当用户注销时,销毁会话可能是您要做的最后一件事。 这样可以确保将到目前为止设置的会话变量从活动会话中删除,并且不再可用于后续请求。

让我们拉入destroy方法的代码并进行遍历。

public function destroy()
{
    $this->session->set_userdata('favourite_website', 'http://tutsplus.com');
    
    // destroy session
    $this->session->sess_destroy();
}

正是sess_destroy方法帮助我们破坏了活动会话。 当然,它还将删除在活动会话中设置的tempdata和flashdata变量。

一旦会话在当前用户上下文中不再有用,请确保您习惯于破坏会话。

顶部的樱桃:会话驱动程序

我们将讨论本文的最后一部分-会话驱动程序。 通常,您不必担心在应用程序中配置会话驱动程序,因为默认会话驱动程序(文件系统)已经使用默认设置进行了配置。

因此,它是保存所有与会话有关的数据的文件系统,它得到了广泛使用,并且是会话处理的公认标准。 话虽如此,CodeIgniter还支持其他会话驱动程序,如果您希望从默认文件系统会话驱动程序切换,可以使用这些会话驱动程序。

以下是CodeIgniter中所有受支持的会话驱动程序的列表:

  • 档案
  • 数据库
  • 雷迪斯
  • 记忆快取

顾名思义,数据库会话驱动程序将会话数据存储在为CodeIgniter应用程序配置的数据库中。

另一方面,其他两个会话驱动程序是高性能网站首选的内存中存储机制。

application/config/config.php文件中,您可以配置要在应用程序中使用的会话驱动程序。

$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'custom_sessions';

它告诉CodeIgniter使用数据库会话驱动程序,会话数据将保存在MySQL的custom_sessions表中。

关于每个会话驱动程序的讨论不在本文讨论范围之内,但是您可以阅读官方站点文档,该文档为每个驱动程序提供了深入的指南。

结论

今天的教程主题是CodeIgniter中的会话处理,并且我们通过研究本主题的各个方面对其进行了全面讨论。

从基本的会话操作开始,我们还介绍了一些很酷的flashdata和tempdata方法,而对会话驱动程序的讨论是本文的结尾。

与往常一样,您可以使用下面的提要大声疾呼您的疑问和建议!

翻译自: https://code.tutsplus.com/tutorials/how-to-work-with-session-data-in-codeigniter--cms-28658

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值