如何防止Yii自动打开数据库

时间:2018-09-20 05:14:41

标签: yii

我正在使用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);

usernamedbname相同,并且password对于所有数据库都是相同的。 当我打开门户网站时,它会给我

 CDbException
 CDbConnection failed to open the DB connection.

但是,当我在 connectionString 内的usernamemain.php中写入实时数据库的真实值时,它将打开,然后更改此值并连接到正确的数据库中。

我的问题是: 如何阻止Yii在 Controller.php 中运行代码之前自动连接。我设置了'active' => FALSE,但没有帮助。

1 个答案:

答案 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',
]));