如何在codeigniter中连接用户指定的数据库

时间:2012-07-24 01:26:21

标签: php database codeigniter dynamic connection

我有一个项目,我必须连接用户指定的数据库。我想以适当的codeigniter的风格实现它,但我不知道我怎么能在database.iter文件中将codeigniter存储数据库凭据有任何方法使其动态化。或者还有其他方法来实现这一目标吗?我用Google搜索了,但没有找到任何帮助。任何帮助和建议将不胜感激。

更新:
该项目涉及报告。我有一个表单,我获得了数据库登录凭据,然后生成有关其数据库的报告,一切都将在运行时完成。

3 个答案:

答案 0 :(得分:9)

根据the guide,您可以通过$this->load->model的第三个参数手动传递数据库连接设置:

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('Model_name', '', $config);
// or as gorelative notes, to access multiple databases:
$DB2 = $this->load->database($config, TRUE);

答案 1 :(得分:4)

我知道这是一个古老的主题,但我一直在寻找这些信息,并相信其他人也可能需要这些信息。

  

如果您只需要在同一连接上使用不同的数据库,则无需创建单独的数据库配置。您可以在需要时切换到其他数据库,如下所示:

$this->db->db_select($database2_name)

这解决了我。

答案 2 :(得分:3)

首先关闭一个警告词

应该注意的是,这可能不是推荐的最佳建议,除非您限制用户允许的数据库名称或不允许他们自己选择它。

如果第一个场景是必须的,请清理数据,如果您知道其已定义的数据库名称列表,请为它们提供一个列表并对列表进行验证。

话虽如此:

这是您描述的代码。我在我的控制器中这样做。并在我的模型中引用$db2->

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = $customUserDatabase;
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$DB2 = $this->load->database($config);

$q = $DB2->where('id', 13)->get('tablename');

if( $q->num_rows() > 0 ){
  return $q->result();
}else{
  return false;
}

http://codeigniter.com/user_guide/database/connecting.html

参考有关连接多个数据库的部分......


  

连接到多个数据库

     

如果您需要同时连接到多个数据库   可以这样做:

$DB1 = $this->load->database('group_one', TRUE); $DB2 = $this->load->database('group_two', TRUE);
     

注意:更改单词   “group_one”和“group_two”指向您所在的特定组名   连接到(或者您可以传递指示的连接值   上文)。

     

通过将第二个参数设置为TRUE(布尔值),函数将会   返回数据库对象。

     

以这种方式连接时,您将使用您的对象名称进行发布   命令而不是本指南中使用的语法。其他   单词,而不是发出命令:

$this->db->query(); $this->db->result(); etc...
     

您将使用:

$DB1->query(); $DB1->result(); etc...

实时工作代码示例。

我使用这个完全相同的功能放置了我的控制器/模型的片段。我需要使用跨多个数据库的相同凭据/配置连接到多个数据库..因此我能够使用$this->db->来获取配置。

您可以在此处查看其中的要点:https://gist.github.com/08a4f45da1ff7e177425