CodeIgniter: SQL-аудит всех вызовов метода $ this-> db-> query ()? - PullRequest
5 голосов
/ 25 октября 2011

Я использую CodeIgniter 2+ и хотел бы Аудит всех $this->db->query($sql); вызовов.

Все наши вызовы базы данных выполняются методом query (); нет активного использования записи. Мне нужно записать запросы $ sql и ввести их в пользовательскую таблицу для целей записи аудита. Кто-нибудь знает способ расширить библиотеку базы данных базовой системы для аудита запросов?

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

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Зависит от того, как вы хотите их проверять.Если вы ищете для каждой страницы, то включение профилировщика будет в порядке.Здесь показаны все запросы, выполняемые при загрузке этой страницы, а также время, затраченное на их выполнение.См. Ссылку ниже на профилировщике.

http://codeigniter.com/user_guide/general/profiling.html

Если вы хотите регистрировать все запросы по мере их поступления, а затем читать файл журнала позже, вам придется расширитькласс базы данных.Если дело обстоит именно так, прокомментируйте, и я буду обновлять / расширять свой ответ дальше.

Расширение для перезаписи query()

Расширение MY_Loader.php в / application / core / и вставьте эту функцию

function database($params = '', $return = FALSE, $active_record = NULL)
    {
        // Grab the super object
        $CI =& get_instance();

        // 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;
        }

        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;
    }

Затем создайте /application/core/MY_DB_mysql_driver.php

Затем внутри этого вы можете перезаписать query ()

function query($sql, $binds = FALSE, $return_object = TRUE) {
    // Do your stuff
    return parent::query( $sql, $binds, $return_object );
}

Очевидно, замените mysql в имени файла накакой бы драйвер базы данных вы ни использовали / пытались расширить.

Это также будет работать с Active Record, поскольку все методы get() вызывают драйвер query() для запуска своих запросов.

3 голосов
/ 25 октября 2011

Кажется, что вы могли бы расширить класс базы данных и переписать метод query, но согласно Филу , это невозможно сделать.

Одним из решений является создание вспомогательного метода, который вы можете заменить всеми своими $this->db->query вызовами, который будет регистрировать ваши запросы, а затем вызвать метод query.

UPDATE

Вы можете создать библиотеку, которая копирует метод _compile_queries библиотеки Profiler (строка 168 из https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Profiler.php).. Обычно этот метод выводит все запросы в браузер, но вы можете реализовать его так, чтобы протоколировался все запросы. Тогда вы не только получите запросы, сгенерированные с помощью $this->db->query, но и все запросы будут выполнены.

3 голосов
/ 25 октября 2011

Если вы просто хотите сделать это напрямую ...

Функция запроса находится в строке 250 system / database / DB_driver.php (или около того в зависимости от вашей версии).

В строке 289 есть комментарий «Выполнить запрос».

Выведите $sql любым удобным для вас способом.

...