与Codeigniter 3的多站点数据库自动切换

时间:2015-11-30 08:10:38

标签: php mysql .htaccess codeigniter codeigniter-3

大家好我需要使用Codeigniter为多站点提供一些帮助。

所以我正在开发一个多站点系统,不同的公司注册并给他们的子域(例如公司ABC转到www.system.com并注册,然后他们被给予子域{{1然后生成数据库abc.system.com(加密),并由系统创建默认表。

所有公司都使用相同的界面,因此唯一的变化是数据库。

我的想法是每当有人访问abc我爆炸(abc.system.com)并且我abc.system.com加密它并且我将abc中的数据库连接更改为

config/database.php

用户将使用$db['company'] = array( 'database' => 'encrypted(abc)',

但是现在在考虑它时,当其他人碰巧登录$this->db->query时会发生灾难,因为连接会再次更改为xyz.system.com,因为他/她也将使用encrypted(xyz)

请记住,系统是唯一的数据库正在发生变化。

我不了解使用$this->db->query

的多站点技术

现在我遇到了关于如何绕过它的任何想法? 我正在使用codeigniter 3.

1 个答案:

答案 0 :(得分:0)

我可以建议你在MY_Controller类中初始化第二个“公司”数据库,你可以在所有控制器中扩展(也许只有公司相关的那些。

通过CI默认配置,您可以在核心文件夹中创建MY_Conroller,这将扩展CI_Controller,控制器内的任何控制器都可以扩展它。

在这个MY_Controller中,您将能够解析主机(域)并设置正确的数据库.. 示例:

class My_Controller extends CI_Controller {
    protected $dbC;

    public function __construct(){
        parent::__construct();

        //HERE YOU CAN MAKE THE 2nd DB load after you detect that you are in valid subdomain
        $expHost = explode('.', $_SERVER['HTTP_HOST']));
        if( count($expHost) === 3 && $expHost !== 'www') {
            $dbC_config = // Get your DB COMPANY configurations or input it here as array..
            $dbC_config['database'] = 'encrypted('.$expHost[0].')';
            $this->dbC = $this->load->database($dbC_config);
        }
    }
}