Codeigniter изменить конфигурацию базы данных во время выполнения - PullRequest
6 голосов
/ 19 октября 2011

Могу ли я изменить конфигурацию базы данных для каждого метода в контроллере?

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

По умолчанию установлено значение TRUE, в то время как мне нужно установить значение false в определенном методе, чтобы перехватить ошибку и сделать что-то еще(например, показать страницу 404).

Когда я попробовал $this->config->load('database'), это не удалось.

Другой вопрос:

Могу ли я проверить неправильный запрос и перехватить его для некоторых переменныхвместо того, чтобы показывать это пользователям, кроме установки db_debug config на FALSE?

Ответы [ 5 ]

15 голосов
/ 05 сентября 2013

Я проверил код системы / базы данных / DB_Driver и обнаружил, что:

$this->db->db_debug = FALSE;

будет работать в моем контроллере для включения / отключения отладочной информации на лету.

3 голосов
/ 16 января 2012

Расширяя ответ от comenk, вы можете расширить класс базы данных и реализовать различные методы, с помощью которых можно достичь своей цели.

Во-первых, вам необходимо расширить базовый класс Loader, создав MY_Loader.php file

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.

В этот момент вы добавите ответ коменка к 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();
1 голос
/ 26 июня 2013

$ this-> db-> db_debug = 0;// 0: выкл., 1: вкл. Это червь для меня ... Вы можете посмотреть переменную $ GLOBALS, чтобы найти этот общий параметр.

1 голос
/ 16 января 2012

Вы должны добавить функцию в 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();
0 голосов
/ 20 октября 2011

Чтобы скрыть плохой SQL (и другие ошибки) от пользователей, вам нужно установить уровень сообщений об ошибках php.CodeIgniter поставляется в основном режиме разработки.

Перейдите на index.php и замените этот

error_reporting(E_ALL);

на этот

error_reporting(0);

Это быстрый способ сделать это.Вы также можете реализовать это с помощью ловушки, так что вам не нужно прикасаться к файлам CI.Вы также можете добавить логику к этому хуку, чтобы он устанавливал ее только на рабочем сервере.

Для отладки SQL вы можете создать класс, который наследуется от CI_Model, а затем создать все классы вашей модели для расширения этого класса.В этом классе вы можете добавить код для выполнения запросов, который записывает запросы в журнал, чтобы вам было легче их отлаживать.Это не поможет, если сам запрос плохой, но вы должны быть в состоянии выяснить это, прежде чем доберетесь до этой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...