通过辅助函数在codeigniter中初始化第二个数据库

时间:2018-11-26 13:56:54

标签: codeigniter

在我的站点中,有不同的模块,每个模块都有自己的数据表。

所以现在我不确定哪种方法最好地连接这些模块。

我的想法是创建一个辅助函数,该函数测试数据库连接是否可用。如果没有,则助手应初始化数据库,并使数据库中的查询可在控制器和模型中使用。

在Codeigniter的文档中,我仅找到有关多个数据库设置的信息-我找不到使用一种动态助手来做到这一点的示例。

也许有人可以帮助我更进一步?

1 个答案:

答案 0 :(得分:0)

您可以做的是设置db_name,db_user和db_pass的会话(如果每个db_name的user和pass不同)。为了在不总是通过访问权限的情况下重用动态数据库。

这是一个实现:

助手:

if (!function_exists('get_dynamic_db')){
    function get_dynamic_db()
    {
        $CI =& get_instance();
        $db = $CI->session->user_data('other_db');
        $user = $CI->session->user_data('other_db_user');
        $pass = $CI->session->user_data('other_db_pass');

        $config_app = array(
            'dsn'   => '',
            'hostname' => 'localhost',
            'username' => $user,
            'password' => $pass,
            'database' => $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
        );

        return $CI->load->database($config_app,TRUE);
    }
}

型号:

Class DD_model extends CI_Model {

    var $dynamic_db;

    public function __construct() {

        $this->load->database(); // default db
        $this->dynamic_db = get_dynamic_db(); // dynamic db
    }

    public function ping_server_db()
    {
        $this->dynamic_db->from('some_table');
        $query = $dynamic_db->get();

        return $query->row() ? true : false;
    }
}

控制器:

public function select_db($db_name)
{
    $this->session->set_userdata(array('other_db' => $db_name, 'other_db_user' => 'user', 'other_db_pass' => 'pass'));
    $dynamic_db = $this->DD_model->ping_server_db();

    if (!$dynamic_db) {

        $this->session->unset_userdata('other_db');
        return false;
    }
}

这样,您就可以在所有模型中使用get_dynamic_db();来从动态数据库中查询