Codeigniter在数据库

时间:2016-05-11 22:22:24

标签: php database codeigniter mysqli multiple-databases

我在使用Codeigniter框架,我需要在不同的数据库之间切换以运行查询。

根据Codeigniter 3.0.6文档,我可以使用 $ this-> db-> db_select(' db_name')来动态更改数据库。但它似乎根本不起作用。

我创建了一个这样的沙箱:

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

    br('========Start========');

    $dbs = $this->dbutil->list_databases();

    foreach ($dbs as $db)
    {
        if ($db == 'information_schema')
            continue;

        br($db);

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

        if ($this->db->table_exists('users'))
            br('Yes');
        else
            br('No');

        echo $this->db->last_query();

        //$tables = $this->db->list_tables();
        //pp($tables);

        br('-----------------------');
    }

    br('========End========');

结果是:它打印不同的DB名称,但是YES / NO和last_query都是相同的,它总是在第一个DB上运行。

所以我创建了另一个手动切换DB的测试,结果是一样的。

我还尝试删除 config / database.php 中的数据库名称,并设置 $ this-&gt; db-&gt; db_select(&#39; my_third_db_name&#39;)< / strong>并始终在第三个数据库上运行查询。

我是否遗漏了代码中的内容?或者这里有错误?

由于

P / S:我只连接到1台主机,这台主机上有很多数据库。连接工作正常

1 个答案:

答案 0 :(得分:2)

我的所作所为:

<强>配置/ database.php中

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'user';
$db['default']['password'] = 'pass';
$db['default']['database'] = 'database1';
$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['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['database2']['hostname'] = "localhost";
$db['database2']['username'] = "user";
$db['database2']['password'] = "pass";
$db['database2']['database'] = "database2";
$db['database2']['dbdriver'] = "mysql";
$db['database2']['dbprefix'] = "";
$db['database2']['pconnect'] = TRUE;
$db['database2']['db_debug'] = TRUE;
$db['database2']['cache_on'] = FALSE;
$db['database2']['cachedir'] = "";
$db['database2']['char_set'] = "utf8";
$db['database2']['dbcollat'] = "utf8_general_ci";   

<强>控制器

$this->load->model('second_model');
$this->second_model->insert("tablename", array("id"=>$value_id, "foo"=>$bar));

<强> second_model.php

function __construct() {
    parent::__construct();
    //$this->output->enable_profiler(TRUE);
    $this->db_2= $this->load->database('database2', TRUE);
}
function insert($table, $data)
{
    $this->db_2->insert($table, $data);
    if ($this->db_2->affected_rows() == '1')    return TRUE;
    else                                    return FALSE;
}
//More functions

这种情况下的问题是你需要为每个数据库提供一个文件......但也许你可以修改......类似于:

function __construct() {
    parent::__construct();
}
function insert($table, $data, $db="default")
{
    $this->$db = $this->load->database($db, TRUE);
    $this->$db->insert($table, $data);
    if ($this->$db->affected_rows() == '1')     return TRUE;
    else                                    return FALSE;
}
/all CRUD functions you need

然后,当您尝试访问特定数据库时,只需发送database.php文件的索引名称。

我希望它可以帮到你。