CakePHPが実行した最後のクエリを取得したいです。 core.phpでデバッグをオンにできず、コードをローカルで実行できません。ライブサイトに影響を与えずに、最後のSQLクエリを取得してエラーログに記録する方法が必要です。このクエリは失敗していますが、実行中です。
このようなものは素晴らしいでしょう:
$this->log($this->ModelName->lastQuery);
前もって感謝します。
Cake 2.0では、これが機能するようにクエリログが保護されています
function getLastQuery() {
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
CakePHP v2.3.2でテスト済み
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
CakePHP 1.xでは、必要なデータにDataSource::_queriesLog
でアクセスできます。 Cakeは実際にこのメンバーのgetterメソッドを提供していませんが、基礎となる言語はPHPであるため、次のことを妨げるものはありません。
app/app_model.php
::
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->_queriesLog;
return end($logs);
}
マットとブラビアのソリューションの組み合わせ(デバッグが2でない場合に機能します):
$dbo = $this->Model->getDatasource();
$oldStateFullDebug = $dbo->fullDebug;
$dbo->fullDebug = true;
// find or whatever...
$this->Model->find("all");
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
CakeLog::write("DBLog", $lastLog['query']);
$dbo->fullDebug = $oldStateFullDebug;
シンプルなshowLog()関数を使用できます
var_dump($this->YourModel->getDataSource()->showLog());
これは非常に遅い答えですが、将来これを必要とする人のために、デバッグの設定をIPにいつでも制限できます。次に例を示します。
Configure::write('debug', 0);
if($_SERVER["REMOTE_ADDR"] == '192.168.0.100'){
Configure::write('debug', 2); //Enables debugging only for your IP.
}
このインラインを使用できます。
$dbo = $this->Model->getDatasource();
// store old state
$oldStateFullDebug = $dbo->fullDebug;
// turn fullDebug on
$dbo->fullDebug = true;
// Your code here! eg.
$this->Model->find('all');
// write to logfile
// use print_r with second argument to return a dump of the array
Debugger::log(print_r($dbo->_queriesLog, true));
// restore fullDebug
$dbo->fullDebug = $oldStateFullDebug;
cakephp api getLog 本をざっと読んで、logTransaction
をオンにできます。使用していませんが、どのように機能するかわかりません。
それ以外の場合は、 FirePHP を試すことができます。ここに ガイド があります。
DebugKit を試すこともできますが、私の頭上では、デバッグ2を動作させるためにまだ必要だと思います。
うまくいけば、何かがあなたにリードを与えるかもしれません。 :)
これを使用できます:
$log = $this->Model->getDataSource()->getLog(false, false);
pr($log);die;
CakePHPでクエリを表示するには2つの方法があります。
どちらの方法でも、app/Config/core.phpに以下の1行を追加する必要があります
_Configure::write('debug', 2);
_
最初の方法:
_debug($this->getLastQuery());
_
クエリを取得したい場所上記の行を追加し、以下のコードを使用して同じコントローラでこの関数getLastQuery()
を呼び出します
_public function getLastQuery() {
$dbo = $this->TModel->getDatasource(); //Here TModel is a model.what table you want to print
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
_
2番目の方法:
任意のElementsファイルに次の行を追加します。
_<?php echo $this->element('sql_dump'); ?>
_