我需要在项目中创建一个查询日志。所以我创建了一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
</ul>
钩子。它将所有已执行的查询保存在文本文件和数据库中。但它仅适用于post_controller
个查询。我知道这是一个重复的问题,但经过大量的搜索后,我无法找到解决方案。
这是我的代码:
配置/ hooks.php:
SELECT
钩/ log_queries.php
$hook['post_controller'] = array(
'class' => 'LogQueryHook',
'function' => 'log_queries',
'filename' => 'log_queries.php',
'filepath' => 'hooks'
);
在我的config.php中启用了和钩子:class LogQueryHook {
function log_queries() {
$CI =& get_instance();
$times = $CI->db->query_times;
//$dbs = array();
$output = NULL;
$queries = $CI->db->queries;
//print_r($queries);
if (count($queries) == 0){
$output .= "no queries\n";
}else{
foreach ($queries as $key=>$query){
$took = round(doubleval($times[$key]), 3);
$CI->db->query('INSERT INTO queryLog_tbl(`query`, `executedTime`, `timeTaken`, `executedBy`) VALUES ("'.$query.'", "'.date('Y-m-d h:i:s').'", "'.$took.'","'.$CI->session->userdata('UserID').'")');
$output .= $query . "\n";
$output .= "===[took:{$took}]\n\n";
}
}
$CI->load->helper('file');
if ( ! write_file(APPPATH . "/logs/queries.log.txt", $output, 'a+')){
log_message('debug','Unable to write query the file');
}
}
}
答案 0 :(得分:1)
执行任何修改查询(插入,更新或删除查询)后,您需要检查内部重定向。如果在修改查询之后放置任何重定向语句,那么它将超过挂钩执行。
您可以通过覆盖query()
system/database/DB_driver.php
方法来实现
或
创建库并从相关控制器调用它。
答案 1 :(得分:0)
由于内部重定向,我的代码会跳过SELECT
以外的所有查询。所以我为此创建了一个库。我在这里附上我的代码。它可能会帮助别人
应用/库/ Querylog.php
class Querylog {
protected $CI;
public function __construct() {
$this->CI =& get_instance();
}
function save_query_in_db() {
$query = $this->CI->db->last_query();
$times = $this->CI->db->query_times;
$time = round(doubleval($times[2]), 5);
$this->CI->db->query('INSERT INTO queryLog_tbl(`query`, `executedTime`, `timeTaken`, `executedBy`) '
. 'VALUES ("'.$query.'", "'.date('Y-m-d h:i:s').'", "'.$time.'","'.$this->CI->session->userdata('UserID').'")');
}
}
在控制器中加载此库或autoload.php
并在任何地方致电save_query_in_db()
例如:在模型中:
$this->db->set('status', 1);
$this->db->where('UserID', $this->session->userdata('UserID'));
$this->db->update('user_tbl');
$this->querylog->save_query_in_db();