CodeIgniter:多个数据库 - 在第二个数据库中访问数据库配置

Posted

技术标签:

【中文标题】CodeIgniter:多个数据库 - 在第二个数据库中访问数据库配置【英文标题】:CodeIgniter: Multiple Databases - Accessing database config in a second database 【发布时间】:2013-02-27 05:02:45 【问题描述】:

我一直在研究通过 CodeIgniter 使用多个数据库。如果我提前知道数据库是什么,那么我可以在配置文件中设置信息,然后调用我需要的任何数据库组。

但是,在我的情况下,我需要将该数据库信息存储在另一个数据库中。它是一种主数据库,其中包含有关客户的一般信息,包括存储客户数据的数据库和凭据。然后,该供应商可以随时添加客户,并将每个客户的数据隔离在不同的数据库中。

如何根据从 CodeIgniter 中的主数据库返回的值设置数据库和凭据,或者有没有办法做到这一点?

谁能指出我正确的方向?提前感谢您的任何建议。

【问题讨论】:

Codeigniter - multiple database connections的可能重复 【参考方案1】:

来自文档 (https://www.codeigniter.com/user_guide/database/connecting.html):

这个函数的第一个参数可以选择用来指定 配置文件中的特定数据库组,或者你甚至可以 提交未在您的数据库中指定的数据库的连接值 配置文件

所以你会做这样的事情,用 ma​​ster 数据库中的值替换值:

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = "";
$config['char_set'] = "utf8";
$config['dbcollat'] = "utf8_general_ci";

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

如果您需要保持与 ma​​ster 数据库和 customer 数据库的连接,则将最后一行更改为:

$customer_db = $this->load->database($config, TRUE);

// to use the master database:
$this->db->query("SELECT * FROM my_table");

// to then use the customer database:
$customer_db->query("SELECT * FROM whatever");

【讨论】:

我完全错过了您可以传递数组或 DSN 字符串(在这里发布问题时我最害怕的总是)。非常感谢您的回复! 您好之后可以配置第二个数据库吗?所以我登陆了我的索引,我得到了一些变量,我想用这些变量来构建另一个数据库,有可能吗?【参考方案2】:

将主数据库设为默认数据库,将客户设为第二个数据库 $active_group = '默认'; $active_record = TRUE;

    $db['default']['hostname'] = '';
    $db['default']['username'] = '';
    $db['default']['password'] = '';
    $db['default']['dbdriver'] = '';
    $db['default']['dbprefix'] = '';
    $db['default']['pconnect'] = TRUE;
    $db['default']['db_debug'] = TRUE;
    $db['default']['cache_on'] = FALSE;
    $db['default']['cachedir'] = '';
    $db['default']['char_set'] = 'utf8';
    $db['default']['dbcollat'] = 'utf8_general_ci';
    $db['default']['swap_pre'] = '';
    $db['default']['autoinit'] = TRUE;
    $db['default']['stricton'] = FALSE;

    $db['secondDatabase']['hostname'] = '';
    $db['secondDatabase']['username'] = '';
    $db['secondDatabase']['password'] = '';
    $db['secondDatabase']['dbdriver'] = '';
    $db['secondDatabase']['dbprefix'] = '';
    $db['secondDatabase']['pconnect'] = TRUE;
    $db['secondDatabase']['db_debug'] = TRUE;
    $db['secondDatabase']['cache_on'] = FALSE;
    $db['secondDatabase']['cachedir'] = '';
    $db['secondDatabase']['char_set'] = 'utf8';
    $db['secondDatabase']['dbcollat'] = 'utf8_general_ci';
    $db['secondDatabase']['swap_pre'] = '';
    $db['secondDatabase']['autoinit'] = TRUE;
    $db['secondDatabase']['stricton'] = FALSE;

您可以在控制器或模型中加载第二个数据库

$DB2 = $this->load->database('secondDatabase', TRUE); 

【讨论】:

【参考方案3】:

/** config/database.php **/

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = '';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['dbdriver'] = '';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = (ENVIRONMENT !== 'production');
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE; 

/** 你的控制器或模型**/

//by default the master database will be loaded and you can directly access db using      $this->db 
   $result = $this->db->query("SELECT * FROM `your_table`")->limit(1)->get()->result();



$config['dbxyz']['hostname'] = $result->hostname;
$config['dbxyz']['username'] = $result->username;
$config['dbxyz']['password'] = $result->password;
$config['dbxyz']['dbdriver'] = '';
$config['dbxyz']['dbprefix'] = '';
$config['dbxyz']['pconnect'] = TRUE;
$config['dbxyz']['db_debug'] = (ENVIRONMENT !== 'production');
$config['dbxyz']['cache_on'] = FALSE;
$config['dbxyz']['cachedir'] = '';
$config['dbxyz']['char_set'] = 'utf8';
$config['dbxyz']['dbcollat'] = 'utf8_general_ci';
$config['dbxyz']['swap_pre'] = '';
$config['dbxyz']['autoinit'] = TRUE;
$config['dbxyz']['stricton'] = FALSE;

//load database config
$this->config->load('database');

//Set database config dynamically        
$this->config->set_item('dbxyz', $config);

//Now you can load the new database using
$this->dbxyz = $this->load->database('dbxyz'); 

注意:更多详情请参考Config Class Codeigniter documentation

【讨论】:

【参考方案4】:

在 application\config\database.php 中添加以下行

$db['mydb2']['hostname'] = 'localhost';
$db['mydb2']['username'] = 'root';
$db['mydb2']['password'] = '';
$db['mydb2']['database'] = 'ci2';
$db['mydb2']['dbdriver'] = 'mysql';
$db['mydb2']['dbprefix'] = '';
$db['mydb2']['pconnect'] = TRUE;
$db['mydb2']['db_debug'] = TRUE;
$db['mydb2']['cache_on'] = FALSE;
$db['mydb2']['cachedir'] = '';
$db['mydb2']['char_set'] = 'utf8';
$db['mydb2']['dbcollat'] = 'utf8_general_ci';
$db['mydb2']['swap_pre'] = '';
$db['mydb2']['autoinit'] = TRUE;
$db['mydb2']['stricton'] = FALSE;

现在我们在控制器和模型中使用第二个数据库,如下所示。

$CI = &get_instance();
$this->db2 = $CI->load->database('mydb2', TRUE);
$qry = $this->db2->query("SELECT * FROM employee");
print_r($qry->result());

我参考了http://www.tutsway.com/use-multiple-db-connections-in-codeigniter.php。这对我有用。

【讨论】:

以上是关于CodeIgniter:多个数据库 - 在第二个数据库中访问数据库配置的主要内容,如果未能解决你的问题,请参考以下文章

如果找到第一个数组中的特定键,则在第二个数组中查找值

使用 CodeIgniter 框架将数据插入到具有外键的多个表中

Codeigniter 从另一个表插入数据并添加到输入帖子

SYSTEMPATH/CodeIgniter.php 在第 219 行

算法笔试题--有两个数组,求第二个数组在第一个数组中的位置(数组要连续比对)

面试题