【问题标题】:CodeIgniter 3 session confusionCodeIgniter 3 会话混乱
【发布时间】:2015-10-06 10:56:22
【问题描述】:

正在升级到 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 服务器版本相对应的手册,以在 'SET last_activity = 1437070556, user_data = 'a:14:{s:9:\\"user_data\\";s:0 附近使用正确的语法:\\"\' 在第 1 行

更新集last_activity = 1437070556,

如您所见,在 UPDATE 和 SET 之间缺少表名

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

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

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

发生数据库错误

错误号:1054

“where 子句”中的未知列“session_id”

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

在哪里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

【问题讨论】:

  • MySQL 命令DESC ci_sessions 的输出是什么?它正在尝试运行查询,但告诉您不存在其会话存储所需的此类列session_id。听起来会话表没有正确定义。
  • @drew010,ci_sessions 表的官方表定义不要求 session_id 列。此外,如果我使用新的 $_SESSION 超全局变量,我可以存储会话数据,但不能使用应该仍然有效的旧方法
  • 在下面查看我的回答,了解它为什么使用session_id。这可能意味着正在使用的会话代码未使用最新的 CI3 会话库。如果您查看CI2 session 的代码,它使用session_idCI3 sessions 使用id,因此正在运行的库代码是 CodeIgniter2 而不是 3,因此是 sql 错误。
  • @halfer 在问题被搁置并看到我在标题中犯的愚蠢错字之后,我变得非常尴尬,完全删除了这个问题。但是,我刚刚为您取消删除它。感谢您的帮助。

标签: php codeigniter session


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并通过删除系统文件夹并将其替换为 CI3 zip 中的原始文件夹来解决它。由于升级,我之前覆盖了它,但仍然出现此错误。

    【讨论】:

      【解决方案3】:

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

      根据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 列没有任何痕迹。

      【讨论】:

      • 似乎另一个开发人员在引入新的 CI 3 类时将旧的 CI 2 会话类留在了系统目录中,因此我们在两者之间遇到了冲突。谢谢德鲁
      • @user45623 乐于助人!很高兴就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2014-06-24
      相关资源
      最近更新 更多