如何通过扩展 CodeIgniter 中的 CI_Controller 让我的多个数据库同时运行? [复制]

Posted

技术标签:

【中文标题】如何通过扩展 CodeIgniter 中的 CI_Controller 让我的多个数据库同时运行? [复制]【英文标题】:How do I get my multiple database running simultaneously by extending the CI_Controller in CodeIgniter? [duplicate] 【发布时间】:2018-07-14 21:17:04 【问题描述】:

我想自动加载我的多个数据库,以便我可以同时使用它们。我的/application/config/database.php 中有这个配置:

$active_group = 'identity';
$query_builder = TRUE;

// DB Connection
$__db['hostname'] = 'localhost';
$__db['username'] = 'root';
$__db['password'] = '1234';

// Database 1
$db['identity'] = array(
    'dsn'      => '',
    'dbdriver' => 'mysqli',
    'hostname' => $__db['hostname'],
    'username' => $__db['username'],
    'password' => $__db['password'],
    'database' => 'x1zn2j_identity',
    'dbprefix' => 'id_',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'cachedir' => '',
    'swap_pre' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'encrypt'  => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

// Database 2
$db['control'] = array(
    'dsn'      => '',
    'dbdriver' => 'mysqli',
    'hostname' => $__db['hostname'],
    'username' => $__db['username'],
    'password' => $__db['password'],
    'database' => 'x1eg2x_ctrl',
    'dbprefix' => 'ctrl_',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'cachedir' => '',
    'swap_pre' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'encrypt'  => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

现在让它更灵活,因为也许在将来,我将添加一个新数据库并将它们包含在我的database.php 配置文件中,这样它就会成为一个无忧的框架。所以我所做的是我创建了一个名为MultiDB.php 的新库并将其添加到autoload.php 配置文件中,以便在每次页面加载时添加它。然后我添加这段代码:

class MultiDB

    public $dbase = array();

    function __construct()
    
        global $db;

        foreach($db as $database)
        
            $this->dbase[$database] = $this->load->database($database, TRUE);
        
    

现在显然,它不会工作。我希望它根据$db 配置自动加载数据库。所以如果我要添加一个新的数据库配置,新的数据库将会加载并且可以使用 CI 的 Query Builder 来使用。

有人吗?

【问题讨论】:

如何确定要使用的配置?也不要在codeigniter中使用全局变量,没有必要。 我想我需要在这里使用extends关键字。 那么我怎样才能加载$db 配置然后循环遍历呢?还有如何在自定义库中使用$this->load->database()?还是我应该创建自己的库? 库不也不应该使用扩展,除非它们正在扩展像 form_validation 这样的核心库。此外,我不会在图书馆这样做。 嗯.. 帮助很大。那么,我怎样才能做到这一点呢?我该怎么办?任何提示? :) 【参考方案1】:

基本上你想创建一个核心MY_Controller 扩展CI_Controller 并加载不同的配置并将它们添加到public 类变量中。这样,当您在 application/controllers 中创建带有视图的控制器时,您扩展了 MY_Controller 而不是 CI_Controller,因此可以访问 MY_Controller 的所有公共方法,包括数据库属性。

// application/core/MY_Controller.php
class MY_Controller extends CI_Controller 

    public $DB1, $DB2;

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



// application/controllers/Some_controller.php
// extend MY_Controller instead CI_Controller
class Some_controller extends MY_Controller 

    public function index() 

        $this->DB1->query(...) // query in database 1
        $this->DB2->query(...) // query in database 2
    


【讨论】:

这是我想要的结果。但是有人将其标记为重复?无论如何,谢谢你。 别担心,祝你项目的其余部分好运! 是的。我开始喜欢像 CodeIgniter 这样的 PHP 框架。我现在可以快速开发,不用担心我的 PHP 应用程序的安全性。

以上是关于如何通过扩展 CodeIgniter 中的 CI_Controller 让我的多个数据库同时运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Laravel 5.2中的其他控制器扩展通用控制器?

Codeigniter:多级模型扩展不起作用。收到错误“找不到类”

转 Codeigniter-实现权限认证

php优秀框架codeigniter学习系列——CI_Input类学习

重定向后如何记住CodeIgniter(CI)中的输入表单数据而不是再次进入同一页面

如何从数据库创建 Codeigniter 语言文件?