Я использую 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
, но все запросы будут выполняться.