如何通过扩展 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:多级模型扩展不起作用。收到错误“找不到类”
php优秀框架codeigniter学习系列——CI_Input类学习