Codeigniter基于第一个DB连接到第二个DB

时间:2018-06-22 12:07:19

标签: php codeigniter

我有一个自动加载的数据库,其所有变量都在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建立了:)

2 个答案:

答案 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无法读取整个密码的问题。