1

我一直在阅读几篇文章以及有关如何在 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();
    }
}

我想知道是否有一些我没有从整个事情中得到的东西,或者我是否使用错误的逻辑来评估辅助数据库是否打开了正确的连接。

我还尝试尝试/捕获连接问题,但没有成功。

提前感谢您提供的所有支持。费德里科

4

1 回答 1

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);

没有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' ) ) {
    // ...
}
于 2013-05-20T20:31:47.480 回答