我正在开发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->DB->DB_select('my_third_DB_name'),它总是在第三个数据库上运行查询。
我在代码中遗漏了什么吗?还是这里有虫子?
感谢
p/S:我只连接到一个主机,而且这个主机上有很多数据库。连接正常
我的工作:
config/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文件的索引名。
我希望它能帮助你。