2011-09-29 110 views
1

很抱歉,如果这是一个真正的新手问题(也是PHP的新手),但我不能从文档看着办吧:切换数据库

我希望能够使用一个默认的数据库,如果我不speficy别的,而且使用$这个 - >数据库具有以下配置工作正常:

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

但这也没有效果。那么我怎样才能为整个模型切换数据库呢?

+0

当你在你的模型('专用$ myDB')创建了一个新的属性,并试图从你的构造设置你做了'$ MYDB = ... '或'$ this-> myDB = ...'? – birderic

回答

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... 
} 

我知道你的问题你说你做了类似的事情,但我不确定你是否做得正确。这将是这样做的正确方法,我不明白为什么如果这样做是不行的。

+0

嗨,谢谢,但那是我无法尝试的。我甚至现在再试一次,复制你的代码,以防万一我犯了一个小错误,但没有去......这是行不通的。只要我把函数放入函数中,它就可以正常工作。就好像函数没有访问数据库,即使我已经声明了一个成员变量,并试图使用$ this来访问它,就像在你的例子中一样... – Anders

+0

实际上,问题是一个简单的错字...在构造函数中构造而不是构造...所以,即使我已经尝试过这种方式,你的答案没有错别字,所以我相信你的答案:-) – Anders

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