【问题标题】:Create codeigniter session table automatically自动创建 codeigniter 会话表
【发布时间】:2017-07-19 21:10:30
【问题描述】:

如何自动创建 codeigniter 会话表? 当我在控制器构造函数中使用创建者函数并且会话表不存在时,我看到 codeigniter 错误。我的代码是:

function admin() { 
parent::__construct();
ob_start();
if(!$this->db->table_exists('session'))//for `first time` run.
    $this->utilmodel->create_session_table(); //this function create session table with CI structure
ob_end_clean();
$this->load->library('session'); 
... 
}

我明显的错误是:

Error Number: 1146    
Table 'dbs.session' doesn't exist

INSERT INTO `session` (`session_id`, `ip_address`, `user_agent`,
`last_activity`, `user_data`) VALUES
('0a78608576684ebc2c0050b8f4810f', '127.0.0.1', 'Mozilla/5.0
(Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0
AlexaToolbar/alxf-2.21', 1001550875, '')

Filename: C:\wamp\www\folder\system\database\DB_driver.php

Line Number: 330

之后我就知道了

parent::__construct()

我的错误发生了。

【问题讨论】:

  • 需要更深入地了解您的代码。我也不确定您为什么要即时创建表格。您最好使用数据库迁移脚本,而不是动态创建表。
  • 是的,你需要使用钩子。更具体地说,pre_system 会起作用。
  • 由于我的系统功能,我应该即时创建表。它有一个配置面板,用于配置基本系统设置等。
  • 是的,你说得对,我以前没想过钩子。如果我的问题解决了,我会在这里说。无论如何,非常感谢。

标签: php codeigniter session


【解决方案1】:

只需进入您的 phpmyadmin 并运行此 sql 查询,然后使用 session。您必须在数据库中创建 ci_session 表才能在 codeigniter 中使用 session

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`)
);

【讨论】:

  • 我明白了,但我有一个创建函数可以执行此操作,但在运行此函数之前 codeigniter 会生成此错误,我不想由 phpmyadmin 手动创建此表。
  • 如果你正在使用 session_start() 那么在创建会话表之前不要使用它,因为在 CI 中没有会话表就不能使用它。
  • 也许 session_start() 函数在 codeigniter 构造函数中使用,如果是的话,我可以在哪里更改 codeigniter 构造函数?
【解决方案2】:

你应该使用钩子pre_controller 但是有一个问题:CodeIgniter 不允许在pre_systempre_controller 钩子中使用 DB 类,所以你不能使用活动记录($this->db->query())安装会话表。

我知道 CodeIgniter 指南说

pre_controller - 在调用任何控制器之前立即调用。 所有基类、路由和安全检查都已完成

但这不是真的...(您可以在其他帖子中阅读:pre_controller hook does not load base classes like docs state?)。

无论如何,您可以手动连接到您的数据库。这是一个有点脏的解决方案,但我不知道更好的解决方案。

这是我自动安装会话表的代码。

<?php

class SessionTableInstaller
{
    public function install() 
    {
        if( $db_config = $this->getDBConfig() ) {

            $db_handle = mysql_connect($db_config['hostname'], $db_config['username'], $db_config['password']);

            if ($db_handle === FALSE) {
                throw new Exception('Cannot connect with MySql server');
            }

            if (mysql_select_db($db_config['database'], $db_handle) === FALSE) {
                throw new Exception('Cannot select database');
            }

            $query = "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`)
            ) ENGINE=InnoDB default CHARSET=utf8 ;";

            mysql_query($query);
            mysql_close($db_handle);
        }
    }

    private function getDBConfig()
    {
        require __DIR__ . '/../config/database.php';

        if(!isset($db) || !isset($active_group)) {
            return false;
        }

        $db_config = $db[ $active_group ];
        return $db_config;
    }
}

/* End of file sessionTable.php */
/* Location: ./application/hooks/sessionTable.php */

这是 config/hooks.php

中的代码
$hook['pre_controller'] = array(
    'class'    => 'SessionTableInstaller',
    'function' => 'install',
    'filename' => 'sessionTable.php',
    'filepath' => 'hooks'
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 2016-04-01
    • 1970-01-01
    • 2017-03-08
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多