2017-10-26 7 views
1

내 프로젝트에서 쿼리 로그를 만들어야합니다. 그래서 post_controller 후크를 만들었습니다. 실행 된 모든 쿼리를 텍스트 파일과 데이터베이스에 모두 저장합니다. 그러나 이는 SELECT 검색어에 대해서만 작동합니다. 나는 그것이 반복되는 질문 인 것을 안다. 그러나 많은 수색 후에, 나는 해결책을 찾을 수 없었다.후크를 사용하여 codeigniter에있는 쿼리 로그

설정/hooks.php : 여기

내 코드 내 config.php를 활성화

$hook['post_controller'] = array(
    'class' => 'LogQueryHook', 
    'function' => 'log_queries', 
    'filename' => 'log_queries.php', 
    'filepath' => 'hooks' 
); 

후크/log_queries.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'); 
    } 
} 
} 

후크 : $config['enable_hooks'] = TRUE;

답변

1

수정 쿼리 후 내부 리디렉션을 확인해야합니다 (삽입, U pdate 또는 delete 쿼리)가 실행되었습니다. 수정 쿼리 후에 리다이렉트 (redirect) 명령문을두면 훅 실행을 추월합니다.

당신은 라이브러리를 작성 system/database/DB_driver.php

또는

query() 방법을 덮어 쓰기하여 작업을 수행하고 관련 컨트롤러에서 호출 할 수 있습니다.

+0

귀하의 제안에 감사드립니다. 내가 제안한 라이브러리를 만들었습니다. – geeth

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