2017-10-26 4 views
1

Ich muss ein Abfrageprotokoll in meinem Projekt erstellen. Also habe ich einen post_controller Haken erstellt. Es speichert alle ausgeführten Abfragen sowohl in einer Textdatei als auch in einer Datenbank. Aber es funktioniert nur für SELECT Abfragen. Ich weiß, es ist eine wiederholte Frage, aber nach viel Suche konnte ich keine Lösung finden.Abfrage-Log-Codeigniter mit Haken

Hier ist mein Code:

config/hooks.php:

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

Haken/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'); 
    } 
} 
} 

und in meinem config.php aktiviert Haken: $config['enable_hooks'] = TRUE;

Antwort

1

Sie müssen Ihre interne Umleitung nach jeder Änderungsabfrage prüfen (Einfügen, U pdate oder delete query) ausgeführt. Wenn Sie nach der Modifikationsabfrage eine Redirect-Anweisung eingeben, wird die Hook-Ausführung überholt.

Sie können es tun, indem Sie die query() Methode in system/database/DB_driver.php

Oder

Überschreiben

Bibliothek erstellen und sie von entsprechenden Controller nennen.

+0

danke für Ihren Vorschlag. Ich habe eine Bibliothek für das selbe wie du vorgeschlagen erstellt. – geeth

0

Mein Code überspringt alle Abfragen außer SELECT wegen interner Umleitung. Also habe ich eine Bibliothek dafür erstellt. Ich füge meinen Code hier an. Es kann jemand anderes

application/Bibliotheken/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').'")'); 
    } 
} 

Last diese Bibliothek in Ihrem Controller helfen oder

autoload.php und rufen save_query_in_db() wo immer Sie wollen

zB: im Modell:

$this->db->set('status', 1); 
$this->db->where('UserID', $this->session->userdata('UserID')); 
$this->db->update('user_tbl'); 
$this->querylog->save_query_in_db();