我正在考虑从我的自动加载文件中删除数据库库。我正在缓存页面上的所有内容,所以我不需要每次都连接到数据库,我认为如果我让 CI 连接到数据库,那是在浪费速度。
我现在的问题是:如果我例如在$this->load->database()
没有参数的情况下在 MY_Model 中加载数据库(它们来自配置文件),是否会为我在控制器中使用的每个模型建立一个新的连接?
还是会像只加载一次的助手一样?
我正在考虑从我的自动加载文件中删除数据库库。我正在缓存页面上的所有内容,所以我不需要每次都连接到数据库,我认为如果我让 CI 连接到数据库,那是在浪费速度。
我现在的问题是:如果我例如在$this->load->database()
没有参数的情况下在 MY_Model 中加载数据库(它们来自配置文件),是否会为我在控制器中使用的每个模型建立一个新的连接?
还是会像只加载一次的助手一样?
它们只加载一次。数据库类为您确保这一点。
不,您只会连接到一个数据库。你指定的那个database.php
但是,您可以连接到多个数据库。假设您有两个连接,database.php
如下所示:
/* FORUM */
$active_group = "forum";
$active_record = TRUE;
$db['forum']['hostname'] = "xxxxx";
$db['forum']['username'] = "xxxxx";
$db['forum']['password'] = "xxxxx";
$db['forum']['database'] = "xxxxx";
$db['forum']['dbdriver'] = "mysql";
$db['forum']['dbprefix'] = "";
$db['forum']['pconnect'] = TRUE;
$db['forum']['db_debug'] = TRUE;
$db['forum']['cache_on'] = FALSE;
$db['forum']['cachedir'] = "";
$db['forum']['char_set'] = "utf8";
$db['forum']['dbcollat'] = "utf8_general_ci";
/* TEST SITE */
$active_group = "default";
$active_record = TRUE;
$db['default']['hostname'] = "xxxxx";
$db['default']['username'] = "xxxxx";
$db['default']['password'] = "xxxxx";
$db['default']['database'] = "xxxxx";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
您可以使用以下方法调用此数据库:
$this->db_forum = $this->CI->load->database('forum', TRUE);
访问 db1 喜欢$this->db
和 db2 一样$this->db_forum
您可以查看 CI 文档以获取更多信息:http ://ellislab.com/codeigniter/user-guide/database/connecting.html
我只是用了一个简单的例子。
希望能帮助到你。
加载模型后,您可以使用它:
$this->load->model('my_model', NULL, TRUE);
第三个参数将自行连接到数据库。
通过查看system/core/Loader.php
.
并且在同一个文件中,如果已经设置,在连接之前$this->load->database();
运行并返回,所以不用担心多重连接:FALSE
$this->db
// Do we even need to load the database class?
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db))
{
return FALSE;
}
我让它工作起来很容易,我有一个根据登录用户名选择数据库的站点,所以我有一个包含动态可选数据库信息的“主”数据库。我所做的方法是将此代码放置在我需要更改数据库的位置,如下所示:
$db1['hostname'] = 'localhost';
$db1['username'] = $fila['dbusername'];
$db1['password'] = $fila['dbpass'];
$db1['database'] = $fila['dbname'];
$db1['dbdriver'] = 'mysqli';
$db1['dbprefix'] = 'ospos_';
$db1['pconnect'] = FALSE;
$db1['db_debug'] = TRUE;
$db1['cache_on'] = FALSE;
$db1['cachedir'] = '';
$db1['char_set'] = 'utf8';
$db1['dbcollat'] = 'utf8_general_ci';
$db1['swap_pre'] = '';
$db1['autoinit'] = TRUE;
$db1['stricton'] = FALSE;
$this->db->close();
$this->load->database($db1,FALSE);
如果要在选择数据库后使其永久化,我建议使用会话 var 并修改 autoload.php 文件,例如:
class DatabaseLoader {
public function __construct() {
$this->load();
}
public function load() {
$CI =& get_instance();
$may_db=$CI->session->userdata('may_db');
if($may_db)
{
$CI->db = $CI->load->database($may_db, TRUE);
}
else
{
$CI->db = $CI->load->database('default', TRUE);
}
}
}
并将数据库信息添加到第一部分代码中的会话变量中:
$this->session->set_userdata('may_db',$db1);