使用hook查询codeigniter中的日志

时间:2017-10-26 10:27:23

标签: php mysql codeigniter hook

我需要在项目中创建一个查询日志。所以我创建了一个<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'); } } }

2 个答案:

答案 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();