【问题标题】:PHP Yii: Database connect in runtimePHP Yii:运行时数据库连接
【发布时间】:2013-10-26 01:17:33
【问题描述】:

我想在运行时用 Yii 连接到第二个数据库。数据库名称将来自用户登录后的数据库表。

我在教程中看到我应该这样做:

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

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

但在我的控制器中,当我访问 Yii::app()->db2 时出现错误:

未定义属性“CWebApplication.db2”

我做错了什么?

【问题讨论】:

    标签: php yii runtime components


    【解决方案1】:

    以下对我有用:

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

    【讨论】:

      【解决方案2】:

      来自此评论:

      我的问题不在于组件的创建。很快 创建如果我访问 Yii::app()->db2 它的作品,但是当我尝试 通过另一个模型或控制器访问我得到错误

      我认为您只在某处设置此组件一次,然后向不同的控制器发出后续请求。

      您需要在每次请求时将代码放在每次调用的地方。 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);
          }
      }
      

      希望它有所帮助,我在这里假设了很多事情:)

      【讨论】:

        【解决方案3】:

        更新:尝试,而不是实例,传递配置:

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

        或者,您可以在配置中为params创建特殊索引,例如:

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

        而使用Yii::app()-&gt;params['db2'] = $db2

        【讨论】:

        • 当我尝试这样做时,我收到以下错误:Missing argument 2 for CModule::setComponent()
        • 我的问题不在于组件的创建。创建后不久,如果我访问 Yii::app()-&gt;db2 它的作品,但是当我尝试通过另一个模型或控制器访问时,我得到了错误
        • 好吧,试试 Yii::app()->setComponents(array('db2'=>$db2)); (带“s”)。或者试试 Yii::app()->setComponent('db2', )
        • 有趣。另一个想法:在主配置中保留名称 db2 并尝试立即更改它。如果不起作用,您可以在“参数”中创建特殊键并更改它...请尝试
        • 当我尝试访问Yii::app()-&gt;params['db2']时,它返回null..我正在尝试更改模块内的参数,您知道yii在这方面是否有任何限制?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多