Codeigniter - 使用多个数据库
Posted
技术标签:
【中文标题】Codeigniter - 使用多个数据库【英文标题】:Codeigniter - Using Multiple Databases 【发布时间】:2010-10-12 16:01:32 【问题描述】:database.php:
$db['default']['hostname'] = "192.168.2.104";
$db['default']['username'] = "webuser";
$db['default']['password'] = "----";
$db['default']['database'] = "vad";
$db['default']['dbdriver'] = "mysql";
$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['stats']['hostname'] = "192.168.2.104";
$db['stats']['username'] = "webuser";
$db['stats']['password'] = "---";
$db['stats']['database'] = "vad_stats";
$db['stats']['dbdriver'] = "mysql";
$db['stats']['dbprefix'] = "";
$db['stats']['pconnect'] = TRUE;
$db['stats']['db_debug'] = TRUE;
$db['stats']['cache_on'] = FALSE;
$db['stats']['cachedir'] = "";
$db['stats']['char_set'] = "utf8";
$db['stats']['dbcollat'] = "utf8_general_ci";
问题是我只能在配置一中定义
$active_group
,默认值或统计信息。我遵循了 CodeIgniter 文档并添加了以下内容:
$DB2 = $this->load->database('stats', TRUE);
这样我连接到第二个数据库,但我失去了与第一个数据库的连接。有没有人知道如何加载两个数据库而不必在所有模型构造函数中执行以下操作?
$database1 = $this->load->database('database1', TRUE);
$database2 = $this->load->database('database2', TRUE);
问候,
佩德罗
【问题讨论】:
【参考方案1】:codeigniter 中有一个错误。在类中插入一行将解决整个问题。以下是原文出处:http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/
** 此修复不适用于 PostgreSQL
这是一个副本,以防网站出现故障。
行号已更改。这是来自 codeigniter 的错误修复:
开始修正说明
所有数据库调用都转到同一个数据库(最后一个已初始化)
要解决这个问题,请更改 /system/database/DB_driver.php 中的 simple_query 函数:
function simple_query($sql)
if ( ! $this->conn_id)
$this->initialize();
$this->db_select(); //<----------------- Added this line
return $this->_execute($sql);
这完全解决了问题,所以你可以在模型中做这样的事情
$this->legacy_db = $this->load->database('legacy', true);
【讨论】:
CodeIgniter 在 2013 年 10 月仍然出现这个不可原谅的错误,并且这个修复不起作用。 如果您正在开始一个新项目,我建议您使用 FuelPHP。许多编写 CodeIgniter 的人都迁移到了对 CodeIgniter 的完全重写和重新思考。如果你在一个遗留项目上,或者你的客户需要 CodeIgniter,这个修复应该可以工作。但是,如果您找到其他解决方法,请在此处分享。谢谢! 这仍然适用于 CI(2.1.3 版本),并且比每次手动调用 db_select() 要好得多。 $this->db_select();所以需要将数据库名称放在这个选择器中吗?【参考方案2】:您也可以将 database.php 文件中的“pconnect”标志设置为所有连接的 FALSE,而不是应用 Camacho 提到的 hack。
【讨论】:
我写了一篇关于在 CodeIgniter 应用程序中创建多个数据库连接的文章。请查看并提出您的建议cloudways.com/blog/connect-multiple-databases-codeigniter【参考方案3】:目前,codeigniter 无法在持久连接中连接到多个数据库。 所以,你应该关闭你的连接的持久化。 你可以这样做..
$db['default']['pconnect'] = FALSE;
$db['stats']['pconnect'] = FALSE;
【讨论】:
所以我们可以在 db_select 函数中提及数据库名称?【参考方案4】:我修复了在框架上更改 DB_driver.php 的问题。
在这个函数中,我添加了$this->db_select();
,当您使用 2 个数据库时,您再也不会失去连接。
function simple_query($sql)
if ( ! $this->conn_id)
$this->initialize();
$this->db_select();
return $this->_execute($sql);
【讨论】:
【参考方案5】:您可以尝试修改 session.php 文件中的 CI_Session() 函数。
替换
$this->CI->load->database();
有了这个
$this->CI->db1 = $this->CI->load->database('default', TRUE);
$this->CI->db2 = $this->CI->load->database('db2', TRUE);
这样,你不需要在所有模型文件中加载2个db,而是直接使用对象来使用它们。
$this->db1 将访问默认组 db,而 $this->db2 将访问 db2 组 db。 (两个 db 组都应该在 database.php 中定义)
孙达
【讨论】:
【参考方案6】:如果您只需要在同一连接上使用不同的数据库,则无需创建单独的数据库配置。您可以在需要时切换到不同的数据库,如下所示:
$this->db->db_select($database2_name);
CodeIgbiter User Guide
【讨论】:
以上是关于Codeigniter - 使用多个数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用 CodeIgniter 框架将数据插入到具有外键的多个表中