如何在codeigniter中使用会话表

Posted

技术标签:

【中文标题】如何在codeigniter中使用会话表【英文标题】:How to use session table in code igniter 【发布时间】:2014-01-10 03:37:51 【问题描述】:

我是代码点火器的新手,想问一下如何在数据库中使用会话与会话表。 我已经用这个结构创建了会话表。

CREATE TABLE `sys_sessions` (
    `session_id` VARCHAR(40) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
    `ip_address` VARCHAR(16) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
    `user_agent` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `last_activity` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `user_data` TEXT NOT NULL COLLATE 'utf8_unicode_ci',
    PRIMARY KEY (`session_id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

并使用两个控制器来测试使用的会话。首先我运行 set_session_test() 控制器。

public function set_session_test()

   $this->load->library('session');
   $this->session->set_userdata('username', 'Jhon');
   $this->session->set_userdata('email', 'jhon@gmail.com');
   echo "<pre>"; print_r($this->session->all_userdata()); echo "</pre>";

结果

Array
(
    [session_id] => dd7e0e2266da6481ef45faaa7e3c808b
    [ip_address] => 127.0.0.1
    [user_agent] => Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/31.0.1650.63 Safari/537.36
    [last_activity] => 1387619782
    [user_data] => 
    [username] => Jhon
    [email] => jhon@gmail.com
)

然后我运行 get_session_test() 来检查它的会话值是否仍然存在。

public function get_session_test()

   $this->load->library('session');
   $this->session->userdata('username');
   $this->session->userdata('email');
   echo "<pre>"; print_r($this->session->all_userdata()); echo "</pre>";

结果是

Array
(
    [session_id] => 1b10e3671728804a63266bb9295b7e5d
    [ip_address] => 127.0.0.1
    [user_agent] => Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
    [last_activity] => 1387619831
    [user_data] => 
)

不幸的是,我没有找到我存储的任何用户名和电子邮件会话。我检查表 sys_session,它创建了两行 session_id。问题是

    这是 ci session 的常见行为吗? 那么,如何在 CI 表会话中使用 set 和 get 自定义字段? 为什么我移动到另一个页面后创建的自定义字段总是丢失? 当我运行 this->session->sess_destroy() 时,为什么它没有删除表会话中的任何会话?

提前谢谢..

【问题讨论】:

我认为$this-&gt;laod-&gt;library('session'); 删除。打开autoload.php 添加此$autoload['libraries'] = array('database', 'session');。你的控制器没有调用会话库。在get_session_test 上删除$this-&gt;session-&gt;userdata() 两行。这些都是我的猜测……你可以试试。 谢谢兄弟,我会试试的.. 【参考方案1】:

在 codigntier 中已经提供了存储会话的规定

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL,
    ip_address varchar(45) DEFAULT '0' NOT NULL,
    user_agent varchar(120) NOT NULL,
    last_activity int(10) unsigned DEFAULT 0 NOT NULL,
    user_data text NOT NULL,
    PRIMARY KEY (session_id),
    KEY `last_activity_idx` (`last_activity`)
);

创建数据库表后,您可以在 config.php 文件中启用数据库选项,如下所示:

$config['sess_use_database'] = TRUE;

【讨论】:

【参考方案2】:

当您的数据库中的 user_agent 字段太短时,就会发生这种情况:

`user_agent` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci'

实际上,当您计算当前 user_agent 中的字符时,您有超过 50 个字符,因此 CI 不会在数据库中找到与此 user_agent 的任何会话,因为它之前被截断为 50 个字符。

尝试使这个字段更大,它应该可以解决您的问题:

`user_agent` VARCHAR(250) NOT NULL COLLATE 'utf8_unicode_ci'

【讨论】:

【参考方案3】:

$this->session->set_userdata('username', 'Jhon'); $this->session->set_userdata('email', 'jhon@gmail.com');

根据这行:

如果您的会话驱动程序配置为使用数据库,那么您的数据(用户名、电子邮件)将存储在 ci_sessions 表的 user_data 字段中

【讨论】:

以上是关于如何在codeigniter中使用会话表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Codeigniter 进行数据表服务器端处理

Codeigniter 3.0 会话表名称为空字符串,因此出现错误

如何在登录系统中使用会话并在codeigniter中实现注销

如何在 Codeigniter 中检查是不是设置了会话?

我应该在 CodeIgniter 中使用哪个会话库?

CodeIgniter会话表SQL