2013-10-17 112 views
3

我想在運行時使用Yii連接到第二個數據庫。數據庫名稱將在用戶登錄後來自數據庫表。PHP Yii:運行時數據庫連接

我在教程中看到了我應該這樣做:

$db2 = Yii::createComponent(array(
    'class' => 'EMongoClient', 
    'server' => 'mongodb://127.0.0.1:27017', 
    'db' => $emp['database'] 
)); 

Yii::app()->setComponent('db2',$db2); 

但在我CONTROLER當我訪問Yii::app()->db2得到錯誤:

屬性 「CWebApplication.db2」 沒有定義

我究竟做錯了什麼?

回答

3

對我來說,以下工作:

Yii::app()->mongodb->setActive(false); 
Yii::app()->mongodb->setServer('mongodb://localhost:27017'); 
Yii::app()->mongodb->setDb('db1'); 
Yii::app()->mongodb->setActive(true); 
1

更新:嘗試,而不是例如,通過配置:

Yii::app()->setComponent('db2', array(
             'class' => 'EMongoClient', 
             'server' => 'mongodb://127.0.0.1:27017', 
             'db' => $emp['database'] 
           ) 
); 

或者,您也可以在配置params創建特殊的索引,如:

... 
    'params' => array(
     'db2' => null, 
    ), 

而且使用Yii::app()->params['db2'] = $db2

+0

當我嘗試這樣做,我得到以下錯誤:'缺少論據2 CModule :: setComponent ()' –

+0

我的問題不在於創建組件。創建後不久,如果我訪問'Yii :: app() - > db2'其作品,但是當我嘗試通過另一個模型或控制器訪問時,我得到錯誤 –

+0

好吧,嘗試Yii :: app() - > setComponents(array ( 'DB2'=> $ DB2)); (帶「s」)。或者試試Yii :: app() - > setComponent('db2',<配置數組>) – CreatoR

0

來自此評論:

My problem is not with the creation of the component. Soon after creating if I access Yii::app()->db2 its works, but when I try to access via another model or controller I get the error

我想你只是在某個地方設置這個組件,然後向不同的控制器發出後續請求。

您需要將代碼放在每個請求的某個地方,稱爲EVERYTIME。多數民衆贊成PHP如何工作,沒有「全球應用程序狀態」

默認情況下Yii自帶protected/components/controller.php有應用程序的其餘部分的基礎控制器。

我的建議是把你的代碼放在那個控制器的init()方法上,這樣它總是調用

您提到的數據庫名字來自一個表,一旦用戶登錄,所以你需要保存在會話中值,也能夠訪問它的其他要求:

<?php 

// After login in 
Yii::app()->user->setState('db_name', $db_name); 

// in protected/components/controller.php 
public function init() 
{ 
    if (!Yii::app()->user->isGuest) { 
     $db2 = Yii::createComponent(array(
      'class' => 'EMongoClient', 
      'server' => 'mongodb://127.0.0.1:27017', 
      'db' => Yii::app()->user->getState('db_name') 
     )); 

     Yii::app()->setComponent('db2',$db2); 
    } 
} 

希望它能幫助,我在這裏假設很多東西:)