CakePHPで質問です。

公開サイトの為、デバックのレベルは非表示にしたいのですが
SQLのアクセスログを取りたいため、実行したSQL文をPHP上で取得したく思います。
どの様な手法が良いでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/06 07:05:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント67pt

以下の通りです。

$this->Model->query(SQL文);

http://book.cakephp.org/1.3/ja/view/1027/query

他1件のコメントを見る
id:oil999

「実行SQLを保存する処理」というのはどういう意味でしょうか?
トランザクション処理を行いたいということでしょうか。
具体的なコードでお示しください。

2012/01/30 08:17:20
id:makocan

わかりづらくて、申し訳ございません。
その他の回答いただいたのがやりたいものには近いのですが、デバックモードが0の状態で、ファイルに保持したく思います。

2012/02/01 10:02:10
id:cooper0524 No.2

回答回数296ベストアンサー獲得回数4

ポイント67pt

【サムライエンジン】CakePHP-sqlのログをファイルに取得
MySQLの場合ですが、これでいかがでしょう?
いくつか調べた中でも簡単です。

もしかすると上記は公開サイト上にも出てきてしまう恐れがあるので、その場合は
http://www.1x1.jp/blog/2007/04/cakephp_sql_log.html
こちらのほうが良いかもしれません。

id:makocan

やりたいこととしてはピンポイントですが、これは、、デバックのレベルが2以上ではないとダメではないでしょうか?

2012/02/01 10:00:49
id:mario-16 No.3

回答回数219ベストアンサー獲得回数21

ポイント66pt

以下のように変更を加えることでSQLを任意のファイルに吐き出すことができます。

■app/config/database.php

class DATABASE_CONFIG {
    var $default = array(
        'driver' => 'mysql_with_log',           // ここを変更してください
        // ...
    )
} 

■cake/libs/model/datasources/dbo/mysql_with_log.php   ※新規に作成する

<?php

require (LIBS . 'file.php');
require (LIBS . 'model' . DS . 'datasources' . DS . 'dbo' . DS . 'dbo_mysql.php');

class DboMysqlWithLog extends DboMysql {
    function _execute($sql) {
        // ログを残す処理になります
        $filename = ...;        // SQLを出力したいファイル名を設定します
        $log = new File($filename, true);
        $message = date('Y-m-d H:i:s') . ' SQL: ' . $sql . "\n";
        $log->append($message);

        // 本来の処理を呼び出します
        return parent::_execute($sql);
    }
}

?>

回答を作成するにあたって以下のページを参考に致しました。
http://cakephp.1045679.n5.nabble.com/Log-SQL-queries-td1281970.html
http://stackoverflow.com/questions/4721052/how-to-log-sql-queries-to-a-log-file-with-cakephp
http://api.cakephp.org/view_source/file-log/

  • id:tdoi
    ヒントだけ。
    lib/Cake/View/Elements/sql_dump.ctp
    がデバッグレベルが2以上のときに画面にSQLのログを出力する仕組みになっています。
    これを参考にして、ログを取得して、適切なログファイルにでも書き出せばよいかと。

    何かの参考になれば。
  • id:makocan
    わかりづらくて申し訳ございませんが、質問にあるように、デバックのレベルは非表示にしたいのです。
    debugは0にした状態でファイル化何かに出力したく思います。
  • id:tdoi
    別にデバッグレベルは関係ないです。
    sql_dump.ctpを見ると、どのようにSQLクエリのログを取得しているかが分かります。
    それの仕組みでログを取得して記録するコードを、AppController::afterRender()とかにでも書けば解決するのでは?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません