我正在尝试使用post_system
或post_controller
挂钩来捕获并记录数据库表中的所有插入和更新查询。但是,会发生的是$queries = $CI->db->queries;
语句似乎根本没有捕获任何插入或更新语句。即使插入新数据或在相应的视图/控制器中更新旧数据,它也只捕获SELECT语句。
以下是我的相关代码:
hooks.php
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
// also tried with post_controller hook
$hook['post_system'] = array(
'class' => 'Db_query_log',
'function' => 'log_db_queries',
'filename' => 'db_log.php',
'filepath' => 'hooks'
);
钩/ db_log.php
<?php
class Db_query_log {
function __construct() {
//nothing special
}
function log_db_queries() {
$CI = & get_instance();
$queries = $CI->db->queries;
foreach ($queries as $key => $query) {
echo $query . "<br>";
// all statements displayed are SELECT statements even for UPDATE and INSERT operations performed by controllers where data is actually changed
}
}
}
这可能是罪魁祸首?我错过了什么或者这个钩子只是忽略了INSERT / UPDATE操作?
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
使用post_controller
代替post_system
:
$hook['post_controller'] = array(
'class' => 'Db_query_log',
'function' => 'log_db_queries',
'filename' => 'db_log.php',
'filepath' => 'hooks'
);
答案 1 :(得分:0)
要实现此目的,请打开任何帮助文件,并将此代码放在底部
function log_que($sql) {
$filepath = APPPATH . 'logs/Query-log-' . date('Y-m-d') . '.php';
$handle = fopen($filepath, "a+");
fwrite($handle, $sql." \n Execution Time: ".date("Y-m-d H:i:s")."\n\n");
fclose($handle);
}
之后转到system / database / DB_driver.php并找到名为&#34; query&#34;的函数。 并将此代码置于函数内部的顶部。
log_que($sql);'
然后所有查询都将保存在application / logs文件夹中的文件中。
如果您只想保存特定查询,可以输入if条件。 LIKE
if(preg_match('/INSERT/',$sql)) {
fwrite($handle, $sql." \n Execution Time: ".date("Y-m-d H:i:s")."\n\n");
}