【问题标题】:Codeigniter - Multiple database connections - local and remoteCodeigniter - 多个数据库连接 - 本地和远程
【发布时间】:2012-03-04 19:21:18
【问题描述】:

我目前正在构建一个应用程序,用户可以通过该应用程序输入他们自己的个人数据库连接以利用他们的 MySQL 数据库中的数据。

这意味着我将有两个数据库连接 - 我的本地(管理会话等)和用户远程一个。

谁能建议管理这两个连接的最佳方法?我查看了数据库组 - http://codeigniter.com/user_guide/database/connecting.html 但是用户数据库连接将由会话变量设置,因此我无法将远程数据库的详细信息放入配置文件中。

我尝试在我的班级中手动设置一个新的数据库组,例如:

        $db['foreign']['hostname'] = $this->session->userdata('hostname');
        $db['foreign']['username'] = $this->session->userdata('dbuser');
        $db['foreign']['password'] = $this->session->userdata('dbpassword');
        $db['foreign']['database'] = $this->session->userdata('dbname');
        $db['foreign']['dbdriver'] = "mysql";
        $db['foreign']['dbprefix'] = "";
        $db['foreign']['pconnect'] = FALSE;
        $db['foreign']['db_debug'] = TRUE;
        $db['foreign']['cache_on'] = FALSE;
        $db['foreign']['cachedir'] = "";
        $db['foreign']['char_set'] = "utf8";
        $db['foreign']['dbcollat'] = "utf8_general_ci";

        $foreign_db = $this->load->database('foreign', TRUE);

但我在负载线上遇到异常:

You have specified an invalid database connection group.

谁能告诉我如何做到这一点?

非常感谢,本。

【问题讨论】:

  • 请标记正确的答案,以便我们这些有相同问题的人轻松阅读。

标签: php mysql database codeigniter


【解决方案1】:

为了使用组调用语法,组必须在配置文件中定义。 CI 包括将配置直接传递到数据库加载器的能力。 (注意:这可能只是 CI 2+ 功能)

你想要这样的东西:

$db['hostname'] = $this->session->userdata('hostname');
$db['username'] = $this->session->userdata('dbuser');
$db['password'] = $this->session->userdata('dbpassword');
$db['database'] = $this->session->userdata('dbname');
$db['dbdriver'] = "mysql";
$db['dbprefix'] = "";
$db['pconnect'] = FALSE;
$db['db_debug'] = TRUE;
$db['cache_on'] = FALSE;
$db['cachedir'] = "";
$db['char_set'] = "utf8";
$db['dbcollat'] = "utf8_general_ci";

$foreign_db = $this->load->database($db, TRUE);

【讨论】:

    【解决方案2】:

    在您尝试加载“外部”组时,系统可能不知道它。

    你不应该在你的配置文件中加载任何东西;这不是配置文件的用途,这基本上是问题所在。

    如果您确实需要自动加载外部数据库,请通过extending the CI controller 执行此操作并将其加载到它的构造中。

    【讨论】:

    • 感谢您的回复。澄清一下,我不需要自动加载外部数据库,我只是在寻找一种设置外部数据库连接的方法(因为参数由会话变量设置),然后在类中使用新配​​置。我的示例中的参数是我尝试在类中设置它们的位置,而不是配置文件。问候,本。
    • @Ben 好吧,Nenoco 的答案是对的。
    【解决方案3】:

    您可以使用挂钩来获取会话变量并在连接前填充配置变量。

    否则您可以从控制器手动调用第二个 DB 类并使用会话类来定义详细信息?

    【讨论】:

    • 感谢 cmets。那么在配置文件中我会将详细信息设置为空吗? $db['foreign']['hostname'] = '';然后我将如何从控制器设置一个值?问候,本。
    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2011-12-27
    • 2016-10-29
    相关资源
    最近更新 更多