我正在使用Yii 1.1.17作为门户。我使用同一应用程序根据域名连接到不同的数据库。
我在 main.php
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=db',
'emulatePrepare' => TRUE,
'active' => FALSE,
'username' => 'dbUser',
'password' => 'dbP@ssW0rd',
'charset' => 'utf8'
),
然后在 Controller.php
中更改它们,如下所示:
// get database params from url
$url = Yii::app()->request->serverName;
$db_param = explode(".",$url);
$db = Yii::app()->params['db'][$db_param[0]];
Yii::app()->db->setActive(false);
Yii::app()->db->connectionString = mysql:host=127.0.0.1;dbname=$db";
Yii::app()->db->username = $db;
Yii::app()->db->setActive(true);
username
与dbname
相同,并且password
对于所有数据库都是相同的。
当我打开门户网站时,它会给我
CDbException
CDbConnection failed to open the DB connection.
但是,当我在 connectionString
内的username
和main.php
中写入实时数据库的真实值时,它将打开,然后更改此值并连接到正确的数据库中。
我的问题是:
如何阻止Yii在 Controller.php
中运行代码之前自动连接。我设置了'active' => FALSE
,但没有帮助。
答案 0 :(得分:2)
Yii在使用前不会初始化db
组件并打开数据库连接。因此,如果打开了连接,也许您实际上是在运行控制器之前在某个地方使用了此组件(其他组件可能会使用它)?
但是很可能您是在控制器中自己初始化的-访问Yii::app()->db
将初始化db
组件并打开数据库连接。您应该使用setComponent()
覆盖它:
Yii::app()->setComponent('db', [
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=db',
'emulatePrepare' => true,
'active' => false,
'username' => 'dbUser',
'password' => 'dbP@ssW0rd',
'charset' => 'utf8',
]);
或
Yii::app()->setComponent('db', Yii::createComponent([
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=db',
'emulatePrepare' => true,
'active' => false,
'username' => 'dbUser',
'password' => 'dbP@ssW0rd',
'charset' => 'utf8',
]));