CodeIgniter 3会话混乱

时间:2015-07-16 20:11:19

标签: php codeigniter session

升级到CodeIgniter 3 ,遇到Session类的一些问题。

我们配置为在数据库中存储会话。我们已经设置了正确的ci_sessions表,并在Config.php中有这个:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 600;
$config['sess_save_path'] = 'ci_sessions';

尝试使用$this->session->set_userdata($data);

存储会话数据

上面我们得到一个错误,表明CI没有从" sess_save_path"中读取表名。变量:

  

您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在#last_activity = 1437070556,user_data =' a:14:{s:9:\附近使用正确的语法\"的user_data \\&#34 ;; S:0:\\" \'第1行

UPDATE SET last_activity = 1437070556,

正如您所看到的,UPDATE和SET

之间缺少表名

为了解决这个问题,我进入了Config.php并添加了旧的弃用方法来设置你不应该再使用的表名:

$config['sess_table_name'] = 'ci_sessions';

这样做效果更好,但我收到了一个新错误:

  

发生数据库错误

错误号码:1054

未知列' session_id' in' where子句'

UPDATE ci_sessions SET last_activity = 1437075587,user_data =' a:14:{[会话数据从示例中删除]}'

     

WHERE session_id =' 636c6c7389342a7a21111e3e2c3c3f03'

文件名:libraries / Session.php

行号:306

发生了什么,我该如何解决?为什么$config['sess_save_path'] = 'ci_sessions';不起作用?与session_id字段有什么关系?

修改

经过更多测试后,我得出结论:

$config['sess_save_path'] = 'ci_sessions';无法正常工作

$this->session->set_userdata($data);无法正常工作

$this->session->set_userdata('name', $data);无法正常工作

$_SESSION['name'] = $data有效

CI3文档是否非常不准确,或者是其他错误?

编辑2:

新的附加问题:

$this->load->library('session');
$data = $_SESSION['data'];

抛出Undefined variable: _SESSION。我最初的印象是,在任何给定的函数中,我必须写入$ _SESSION才能从$ _SESSION中读取

3 个答案:

答案 0 :(得分:2)

代码中发生了一些奇怪的事情。

根据session database configuration的CodeIgniter3文档,会话表需要使用以下结构进行初始化:

CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(40) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        PRIMARY KEY (id),
        KEY `ci_sessions_timestamp` (`timestamp`)
);

根据您的错误,session_id列不存在,而不是CodeIgniter3正在使用的列。您的代码是否仍以某种方式加载CI2会话代码?我下载了最新版本的CI3,并在Session_database_driver::write()函数中进行了以下调用:

        $insert_data = array(
            'id' => $session_id,
            'ip_address' => $_SERVER['REMOTE_ADDR'],
            'timestamp' => time(),
            'data' => ($this->_platform === 'postgre' ? base64_encode($session_data) : $session_data)
        );

正如您所看到的,session_id列没有任何痕迹。

答案 1 :(得分:1)

我将表格codeigniter 2移动到3后遇到了这个问题。我用替换" system"解决了这个问题。 CI3附带的新文件夹

答案 2 :(得分:0)

我有同样的问题并通过删除系统文件夹并将其替换为CI3 zip中的原始文件来解决它。我之前因为升级而覆盖了它,但仍然有这个错误。

相关问题