我有一个自动加载的数据库,其所有变量都在config/database.php
文件中设置为default
组:
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => 'root',
'database' => 'dbname',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => false,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => false,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => false,
'compress' => false,
'stricton' => false,
'failover' => array(),
'save_queries' => true
);
在此default
数据库中,有一个表需要读取外部数据库,并且我具有所有字段以获取新连接。
我需要同时连接两个数据库,但是我无法在config/database.php
中定义数据库变量,因为它们是动态的,并且可能会根据数据库(默认)的内容而变化。
我的想法是要么在控制器中设置$db['external'] = [...]
并从我读取的默认数据库中设置数据,要么直接使用DNS:
解决方案1:
public function wordpress()
{
$DB = $this->load->database('default', true);
$wp_db = $DB->get_where('dbtable', ['type_needed' => 'wordpress'])->row();
$db['wp_db'] = array(
'dsn' => '',
'hostname' => $wp_db->mysql_host,
'username' => $wp_db->mysql_user,
'password' => $wp_db->mysql_password,
'database' => $wp_db->mysql_db,
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => false,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => false,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => false,
'compress' => false,
'stricton' => false,
'failover' => array(),
'save_queries' => true,
);
$this->WPDB = $this->load->database('wp_db', true);
}
解决方案#1给出“您在config / database.php文件中指定了无效的数据库连接组(wp_db)。”错误
解决方案2:
$DB = $this->load->database('default', true);
$wp_db = $DB->get_where('dbtable', ['type_needed' => 'wordpress'])->row();
$wp_dns = "mysql://$wp_db->mysql_user:$wp_db->mysql_password@$wp_db->mysql_host/$wp_db->mysql_db";
$this->WPDB = $this->load->database($wp_dns, true);
解决方案2提供了“无效的数据库连接字符串”错误
Ps:我要搬到Laravel,但是这个项目已经使用CI建立了:)
答案 0 :(得分:1)
您只需更改以下功能
public function wordpress()
{
$DB = $this->load->database('default', true);
$wp_db = $DB->get_where('dbtable', ['type_needed' => 'wordpress'])->row();
$arrDbData = array(
'dsn' => '',
'hostname' => $wp_db->mysql_host,
'username' => $wp_db->mysql_user,
'password' => $wp_db->mysql_password,
'database' => $wp_db->mysql_db,
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => false,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => false,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => false,
'compress' => false,
'stricton' => false,
'failover' => array(),
'save_queries' => true,
);
$this->WPDB = $this->load->database($arrDbData, true);
}
答案 1 :(得分:0)
我发现解决方案2可以正常工作,但是由于dns连接是STRING,因此请确保密码由字母和数字组成,并且没有符号,否则密码会弄乱字符串并且无法正确读取。 / p>
在我的情况下,密码是这个iidf#q0RDTh#)CrPo5PDLeVe
,因此破折号和括号引起了CI无法读取整个密码的问题。