2014-09-24 56 views
0

如何自動創建codeigniter會話表? 當我在我的控制器構造函數中使用創建者函數,並且當會話表不存在時,我看到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() 

我的錯誤究竟發生後。

+0

需要更深入地瞭解你的代碼。我也不確定你爲什麼試圖在飛行中創建表格。您最好使用數據庫遷移腳本而不是即時創建表。 – 2014-09-24 09:43:13

+0

嘗試使用鉤子? – 2014-09-24 10:04:36

+0

是的,你需要使用鉤子。更具體的'pre_system'將起作用。 – 2014-09-24 10:14:30

回答

0

只需在你的phpmyadmin中運行這個sql查詢,然後使用會話。你在你的數據庫中創建ci_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`) 
); 
+0

我看到了,但我有一個創建者函數,但是在運行此函數之前Codeigniter生成此錯誤,我不想通過phpmyadmin手動創建此表。 – Max 2014-09-24 09:45:21

+0

如果使用session_start(),則在創建會話表之前不要使用它,因爲如果沒有CI中的會話表,就不能使用它。 – 2014-09-24 09:55:45

+0

也許在codeigniter構造函數中使用session_start()函數,如果是的話,那麼我可以改變codeigniter構造函數? – Max 2014-09-24 10:04:02

0

你應該使用掛鉤pre_controller但存在一個問題:CodeIgniter不允許在pre_systempre_controller掛鉤中使用DB類,因此無法使用活動記錄安裝會話表($this->db->query())。

我知道笨指南說

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 */ 

這裏是代碼配置/ hooks.php

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