我一直在阅读几篇文章以及有关如何在CI中连接多个数据库的官方指南。我目前使用标准的database.php配置连接到默认应用程序数据库,并在需要时动态加载其他数据库。该部分应用程序的主要目的是具有“导入”功能,用户用户可以在请求时动态输入外部数据库连接数据。
只要正确设置了第二个数据库连接数据,该应用就像一件轻而易举的事。当连接配置中出现错误时,我没有找到一种工作方法来评估无法将连接建立到其他数据库。
我发现我可以检查$ db-> conn_id是否为false,最终会向用户返回错误但由于某些原因它会返回一个对象,无论如何。
这是我在模型中所做的一个简短示例:
function plugin_subscribers_import_sfguard($channel_id)
{
// Get the channel object by its ID
$channel = $this->get_channel_by('id',$channel_id);
// Set the preferences for the second database
// from the channel informations we retrieved
$db['hostname'] = $channel->host;
$db['username'] = $channel->user;
$db['password'] = $channel->password;
$db['database'] = $channel->db;
$db['dbdriver'] = "mysql";
$db['pconnect'] = FALSE;
$db['db_debug'] = TRUE;
// Open the connection to the 2nd database
$other_db = $this->load->database($db,TRUE);
if ( ! $other_db->conn_id )
{
// This never gets executed as $other_db->conn_id always
// returns: "resource(34) of type (mysql link)"
return false;
}
else
{
// Execute the rest of the import script
$other_db->select('*');
$other_db->from('sf_guard_user');
$other_db->join('sf_guard_user_profile',
'sf_guard_user_profile.id=sf_guard_user.id',
'inner');
$query = $other_db->get();
}
}
我想知道是否有一些东西我没有从整个事情中解脱出来,或者我是否使用错误的逻辑来评估辅助数据库是否打开了正确的连接。
我也试图尝试/捕获连接问题但没有成功。
提前感谢您提供的所有支持。 费德里科
答案 0 :(得分:0)
这是因为通过将第二个参数设置为TRUE(布尔值),函数将返回数据库对象,而DB.php
中有一个函数DB
,最后一个代码块是
function &DB($params = '', $active_record_override = NULL)
{
// ...
$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
$DB = new $driver($params);
if ($DB->autoinit == TRUE)
{
$DB->initialize();
}
if (isset($params['stricton']) && $params['stricton'] == TRUE)
{
$DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"');
}
return $DB;
}
所以,我想,如果你打电话给这个
$other_db = $this->load->database($db,TRUE);
wiuthout TRUE
$other_db = $this->load->database($db);
然后它会给你一个不同的结果。
更新:如果您要使用
$other_db = $this->load->database($db,TRUE);
然后您还可以使用method_exists函数检查方法可用性,例如
$other_db = $this->load->database($db,TRUE);
if( method_exists( $other_db, 'method_name' ) ) {
// ...
}