Codeigniter在运行时更改数据库配置

时间:2011-10-19 02:32:32

标签: codeigniter

我可以在控制器中更改每种方法的数据库配置吗?

$db['default']['db_debug'] = TRUE;

默认值为TRUE,而我需要在某种方法中将其设为false以捕获错误并执行其他操作(例如显示404页面)。

当我尝试$this->config->load('database')时,它失败了。

另一个问题:

我可以查看不正确的查询并将其捕获到某些变量,而不是将其显示给用户,而不是将db_debug配置设置为FALSE吗?

5 个答案:

答案 0 :(得分:15)

我检查了system / database / DB_Driver的代码,发现:

$this->db->db_debug = FALSE;

将在我的控制器中工作,以便即时启用/禁用调试功能。

答案 1 :(得分:3)

扩展comenk的答案,您可以扩展数据库类并实现各种方法来实现您的目标。

首先,您需要通过创建MY_Loader.php文件扩展核心Loader类

class MY_Loader extends CI_Loader
{
    function __construct()
    {
        parent::__construct();
    }

    /**
     * Load the Standard and/or Extended Database function & Driver class
     *
     * @access  public
     * @return  string
     */
    function database( $params = '', $return = FALSE, $active_record = NULL )
    {
        $ci =& get_instance();

        if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($ci->db) AND is_object($ci->db))
        {
            return FALSE;
        }

        $my_db      = config_item('subclass_prefix').'DB';
        $my_db_file = APPPATH.'core/'.$my_db.EXT;

        if(file_exists($my_db_file))
        {
            require_once($my_db_file);
        }
        else
        {
            require_once(BASEPATH.'database/DB'.EXT);
        }

        // Load the DB class
        $db =& DB($params, $active_record);

        $my_driver      = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_driver';
        $my_driver_file = APPPATH.'core/'.$my_driver.EXT;

        if(file_exists($my_driver_file))
        {
            require_once($my_driver_file);
            $db = new $my_driver(get_object_vars($db));
        }

        if ($return === TRUE)
        {
            return $db;
        }

        // Initialize the db variable.  Needed to prevent
        // reference errors with some configurations
        $ci->db = '';
        $ci->db = $db;
    }
}

通过实施上述功能,您可以创建一个MY_DB_mysqli_driver.php,其中mysqli将替换为您在CI database.php配置中使用的任何驱动程序。

此时您需要添加comenk对MY_DB_mysqli_driver.php

的答案
function debug_on() {
     return $this->db_debug = TRUE;
}

function debug_off() {
     return $this->db_debug = FALSE;
}

function in_error() {
     return (bool) $this->_error_number();
}

然后在你的模型/控制器中,

$this->db->debug_off();

$this->db->query('SELECT * FROM `table`');

if( $this->db->in_error() ) {
    show_404();
}

$this->db->debug_on();

答案 2 :(得分:1)

您必须在system / database / DB_driver.php上添加功能

function debug_on()
{
     $this->db_debug = TRUE;
     return TRUE;
}

function debug_off()
{
     $this->db_debug = FALSE;
     return FALSE;
}

之后,您只需执行此命令即可在运行时更改

$this->db->debug_off();
$this->db->reconnect();

答案 3 :(得分:1)

$ this-> db-> db_debug = 0; // 0:关闭,1:开启 那对我而言...... 您可以查看$ GLOBALS变量以找到此通用设置。

答案 4 :(得分:0)

要隐藏用户的错误SQL(以及其他错误),您需要设置php错误报告级别。 CodeIgniter基本上处于开发模式。

转到index.php并替换此

error_reporting(E_ALL);

用这个

error_reporting(0);

这是快速完成的方法。您也可以使用钩子实现此功能,因此您不必触摸CI文件。您还可以向该挂钩添加逻辑,以便它只在生产服务器上设置它。

对于调试SQL,您可以创建一个继承自CI_Model的类,然后创建所有模型类以扩展该类。在该类中,您可以添加用于运行查询的代码,这些查询将查询写入日志,以便您可以更轻松地调试它们。如果查询本身不好,这将无济于事,但您应该能够在达到这一点之前弄明白。