CodeIgniter: SQL-аудит всех вызовов $ this-> db-> query ()?

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

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

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

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

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

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

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

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

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

Если вы просто хотите сделать это прямо …

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

Есть комментарий, который говорит «Запустить запрос» примерно по строке 289.

Выведите $sql любым способом, который вам нравится в этот момент.

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

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

ОБНОВИТЬ

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