1

我正在考虑从我的自动加载文件中删除数据库库。我正在缓存页面上的所有内容,所以我不需要每次都连接到数据库,我认为如果我让 CI 连接到数据库,那是在浪费速度。

我现在的问题是:如果我例如在$this->load->database()没有参数的情况下在 MY_Model 中加载数据库(它们来自配置文件),是否会为我在控制器中使用的每个模型建立一个新的连接?

还是会像只加载一次的助手一样?

4

4 回答 4

7

它们只加载一次。数据库类为您确保这一点。

于 2013-07-02T07:40:30.780 回答
2

不,您只会连接到一个数据库。你指定的那个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

我只是用了一个简单的例子。

希望能帮助到你。

于 2013-07-02T07:44:45.803 回答
1

加载模型后,您可以使用它:

$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;
}
于 2013-07-02T07:49:58.150 回答
0

我让它工作起来很容易,我有一个根据登录用户名选择数据库的站点,所以我有一个包含动态可选数据库信息的“主”数据库。我所做的方法是将此代码放置在我需要更改数据库的位置,如下所示:

$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);
于 2020-01-12T17:35:33.607 回答