Codeigniter在构造中加载数据库与函数中的加载数据库

时间:2017-12-27 04:15:42

标签: php database codeigniter

对于我所做的每个项目,我总是在我的构造函数中加载数据库配置,如下所示

public function __construct() {
    parent::__construct();
    $this->load->database();
}

出于某种原因,我想为一个模型中的每个函数加载不同的配置,如下所示

class Something_model extends CI_Model {

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

    public function getAll() {
        $this->load->database('DB1', TRUE);
        // some code to be executed
    }

    public function getPart() {
        $this->load->database('DB2', TRUE);
        // some code to be executed
    }
}

我需要一些关于加载数据库配置的新方法的建议。在每个函数中加载数据库时是否存在任何性能问题?或者使用安全吗?

另外,有没有建议在一个模型中为不同的函数调用不同的数据库?

3 个答案:

答案 0 :(得分:1)

通过这样做,总是会遇到一些性能损失,这只是课程的标准。通过测试可以确定多少,但CI剖析器可能可以帮助您解决这个问题。

但是,如果您只使用几个不同的数据库并经常使用它们,您可以从MY_Controller全局初始化它们中受益,这样您就不必在每次调用函数时初始化连接

class MY_Controller extends CI_Controller {
    public $DB1, $DB2;

    public function __construct() {
        parent::__construct();
        $this->DB1 = $this->load->database('DB1', TRUE);
        $this->DB2 = $this->load->database('DB2', TRUE);
    }

}

class Some_controller extends MY_Controller {

    public function __construct() {
        $this->load->model('somemodel');
    }

}

//https://www.codeigniter.com/userguide3/database/connecting.html#connecting-to-multiple-databases
class Some_model extends CI_Model {

    public function access_db_1() {
        $this->DB1->query('...');
    }

    public function access_db_2() {
        $this->DB2->query('...');
    }

}

当然,如果你不需要多个配置,你可以:

  

如果您只是,则无需创建单独的数据库配置   需要在同一个连接上使用不同的数据库。您可以   在需要时切换到不同的数据库,如下所示:

     

$这 - > DB-> db_select($ database2_name);

答案 1 :(得分:0)

我认为使用它是免费的,在不同的功能上使用不同的数据库配置应该没有问题,但我也期望一些性能差异,因为你的每个函数都建立了不同的数据库连接

答案 2 :(得分:0)

在每个函数中加载数据库时是否存在任何性能问题?

没有。一点也不。每个功能都单独处理。因此,DB连接没有任何性能问题。除非

  1. 与远程服务器的数据库连接
  2. DB is not fully compatible with PHP。 (意味着MySQL比Oracle更快地对待)
  3. Worst case memory leak in code
  4. 使用安全吗?

    无论您使用哪种方法与CodeIgniter相关联都是安全的。继续使用他们内置的函数/方法和care about their security methods

    另外,有没有建议在一个模型中为不同的功能调用不同的数据库?

    是的,有很多。但是没有标准(喜欢这个)方式。你现在拥有的对我来说也很完美。即使您可以在config.php中创建这些方法并包含在模型中。但是所有这些并没有什么不同。

    <强>建议

    如果您有多个数据库连接,请将DB1保持为默认连接,并在__construct中使用$this->load->database();加载。每当您需要加载第二个数据库连接时,请使用$this->load->database('DB2', TRUE);