2011-10-25 5 views
4

私はCodeIgniter 2+を使用しており、すべて$this->db->query($sql);の呼び出しを監査したいと考えています。

データベースコールはすべてquery()メソッドを使用しています。アクティブなレコードの使用はありません。私は、$ SQLクエリを記録し、監査録画の目的でそれらをカスタムテーブルに入力する必要があります。どのようにクエリの監査にコアシステムデータベースライブラリの拡張の方法を知っていますか?

これは簡単なはずですが、私は単純な解決策を見つけることができません。 CIフォーラムには、古いバージョンに関するいくつかの失敗の記事があります。

+1

サーバにアクセスできる場合は、MySQLの組み込み[クエリロギング](http://dev.mysql.com/doc/refman/5.1/en/query-log.html)を使用できます。 –

+0

ロケット、良いアイデア。しかし、将来、MS SQLまたはOracleに切り替える可能性があります。私は、PHPベースのソリューションを探しています。 – jjwdesign

+0

ああ、大丈夫です。ちょっとしたアイデア:-) –

答えて

5

どのように監査するかによって異なります。ページ単位で検索する場合は、プロファイラを有効にしても問題ありません。これは、そのページのロードで実行されるすべてのクエリと、それらを実行するのにかかる時間を示します。プロファイラの下のリンクを参照してください。

http://codeigniter.com/user_guide/general/profiling.html

あなたは、彼らが起こると、後でログファイルを読み込むと、クエリのすべてのログを記録するために探している場合は、データベースクラスを拡張する必要があります。このような場合は、コメントと私はさらに答えを更新/拡張します。 query()

は、次に、その内部次に/application/core/MY_DB_mysql_driver.php

を作成/アプリケーション/コアでMY_Loader.phpを拡張および/

function database($params = '', $return = FALSE, $active_record = NULL) 
    { 
     // Grab the super object 
     $CI =& get_instance(); 

     // Do we even need to load the database class? 
     if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db)) { 
      return FALSE; 
     } 

     require_once(BASEPATH.'database/DB'.EXT); 

     // Load the DB class 
     $db =& DB($params, $active_record); 

     $my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_driver'; 
     $my_driver_file = APPPATH.'core/'.$my_driver.EXT; 

     if (file_exists($my_driver_file)) { 
      require_once($my_driver_file); 
      $db = new $my_driver(get_object_vars($db)); 
     } 

     if ($return === TRUE) { 
      return $db; 
     } 

     // Initialize the db variable. Needed to prevent 
     // reference errors with some configurations 
     $CI->db = ''; 
     $CI->db = $db; 
    } 

この関数を挿入上書きする拡張

クエリを上書きすることができます。

function query($sql, $binds = FALSE, $return_object = TRUE) { 
    // Do your stuff 
    return parent::query($sql, $binds, $return_object); 
} 

明示的にファイル名のmysqlを、使用している/拡張しようとしているデータベースドライバに置き換えてください。

get()のすべてのメソッドは、ドライバからクエリを実行するためにドライバからquery()を呼び出すため、これはアクティブレコードでも機能します。

+1

私はプロファイリングライブラリをまだ使用していません。私は彼らが起こっている(最後ではない)ようにクエリを監査(記録)し、各クエリをデータベーステーブルのエントリとして保存する必要があります。私はProfilerがこれを手伝ってくれるかどうか分からない。 – jjwdesign

+0

これは私に考えを与える。私はこれに基づいて私の答えを更新しました。 – swatkins

+0

コアに触れることなくデータベースドライバクラスを上書きする方法を説明した私の答えが更新されました。 –

3

あなただけの直接これを実行したい場合は...

クエリ機能は、システム/データベース/ DB_driver.phpライン250(またはので、あなたのバージョンによって異なります)です。

あなたはその時点で好きなようにおよそライン289

出力$sqlで「クエリを実行します」と言うコメントがあります。

+3

+1 - コアを上書きするのは良い考えではありませんが、dbクラスを拡張できないため、あなたがすでに持っているコードを書き直すことなく最高の解決策になれます。 – swatkins

+0

Ecckkkk sppppp、私はコアコードを変更したくないです。 – jjwdesign

+1

私の意見では、codeigniterは良いですが素晴らしいです。あなたの意志にそのコードを曲げない理由はありません。つまり、他のすべてが拡張するカスタムモデルクラスを使用することです。それらはすべて '$ this-> db-> query()'を呼び出す親メソッドを呼び出します。これが終わったら、 '$ this-> db-> last_query()'を呼び出してログインすることができます。または、SQLレイヤーにクエリを記録させることができます。 – evan

3

データベースクラスを拡張してqueryメソッドを上書きすることはできますが、according to Philメソッドを上書きすることはできないようです。

解決策の1つは、クエリをログに記録する$this->db->queryの呼び出しをすべて置き換えることができるヘルパーメソッドを作成してから、queryメソッドを呼び出すことです。あなたはプロファイラライブラリのコピー_compile_queries方法(https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Profiler.phpのライン168)ライブラリーを作成することができ

UPDATE

。通常、このメソッドはすべてのクエリをブラウザに出力しますが、すべてのクエリを記録する方法で実装できます。 $this->db->queryで生成されたクエリを取得するだけでなく、すべてのクエリが実行されます。

関連する問題