在CodeIgniter中切换数据库

时间:2011-09-29 10:43:52

标签: php database-connection codeigniter-2

很抱歉,如果这是一个真正的新手问题(也是一个php新手),但我无法从文档中找到它:

我希望能够使用默认数据库,如果我不指定其他任何东西,并且使用$ this-> db并使用以下配置正常工作:

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'ion_auth';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['visitorsDB']['hostname'] = 'localhost';
$db['visitorsDB']['username'] = 'root';
$db['visitorsDB']['password'] = 'root';
$db['visitorsDB']['database'] = 'visitorsDB';
$db['visitorsDB']['dbdriver'] = 'mysql';
$db['visitorsDB']['dbprefix'] = '';
$db['visitorsDB']['pconnect'] = TRUE;
$db['visitorsDB']['db_debug'] = TRUE;
$db['visitorsDB']['cache_on'] = FALSE;
$db['visitorsDB']['cachedir'] = '';
$db['visitorsDB']['char_set'] = 'utf8';
$db['visitorsDB']['dbcollat'] = 'utf8_general_ci';
$db['visitorsDB']['swap_pre'] = '';
$db['visitorsDB']['autoinit'] = TRUE;
$db['visitorsDB']['stricton'] = FALSE;

但是我想在我的一个模型中使用第二个数据库,所以我尝试了这个:

function __contruct() {
      parent::__construct();
       $this->db =  $this->load->database('visitorsDB', TRUE);
   }

   public function getAllVisitors($paramArr) {
       //$this->db =  $this->load->database('visitorsDB', TRUE);

但这不起作用。只有当我取消注释最后一行以便我在方法本身加载数据库时它才会起作用。我不明白为什么。我也尝试在类的开头声明一个新的类变量 - private $ myDB; - 然后在构造函数中实例化它 - $ myDB = $ this-> load-> database('visitorsDB',TRUE);

但这也不起作用。那么如何为整个模型切换数据库呢?

2 个答案:

答案 0 :(得分:2)

当登录用户更改数据库时

private $db;

function __construct() {
  parent::__construct();

  if($this->session->userdata('username') == "swaroop")
        $this->db = $this->load->database('visitorsDB', TRUE);
    else
        $this->db = $this->load->database('default', TRUE);
}

答案 1 :(得分:1)

我不建议通过覆盖$this->db来选择第二个数据库。只需在您需要的模型中为您的其他数据库添加一个属性,然后通过它访问它。在你的模型中这样做:

private $myDB;

function __construct() {
    parent::__construct();
    $this->myDB = $this->load->database('visitorsDB', TRUE);
}

function getAllVisitors() {
    return $this->myDB->someMethod(); // Or use active record, etc...
}

我在你的问题中知道你说你做了类似的事情,但我不确定你是否做得正确。这将是正确的方式,我不明白为什么如果以这种方式完成它将不起作用。