web-dev-qa-db-ja.com

CakePHP-最後のクエリ実行を取得

CakePHPが実行した最後のクエリを取得したいです。 core.phpでデバッグをオンにできず、コードをローカルで実行できません。ライブサイトに影響を与えずに、最後のSQLクエリを取得してエラーログに記録する方法が必要です。このクエリは失敗していますが、実行中です。

このようなものは素晴らしいでしょう:

$this->log($this->ModelName->lastQuery);

前もって感謝します。

43
Phantz

Cake 2.0では、これが機能するようにクエリログが保護されています

function getLastQuery() {
  $dbo = $this->getDatasource();
  $logs = $dbo->getLog();
  $lastLog = end($logs['log']);
  return $lastLog['query'];
}
46
Matt

CakePHP v2.3.2でテスト済み

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
30
Haktan Suren

CakePHP 1.xでは、必要なデータにDataSource::_queriesLogでアクセスできます。 Cakeは実際にこのメンバーのgetterメソッドを提供していませんが、基礎となる言語はPHPであるため、次のことを妨げるものはありません。

app/app_model.php ::

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->_queriesLog;

    return end($logs);
}
29
Daniel Wright

マットとブラビアのソリューションの組み合わせ(デバッグが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;
3

シンプルなshowLog()関数を使用できます

var_dump($this->YourModel->getDataSource()->showLog());
3
Quy Le

これは非常に遅い答えですが、将来これを必要とする人のために、デバッグの設定をIPにいつでも制限できます。次に例を示します。

Configure::write('debug', 0);
if($_SERVER["REMOTE_ADDR"] == '192.168.0.100'){
Configure::write('debug', 2); //Enables debugging only for your IP.
}
3
alinn

このインラインを使用できます。

$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;
3
blavla

cakephp api getLog 本をざっと読んで、logTransactionをオンにできます。使用していませんが、どのように機能するかわかりません。

それ以外の場合は、 FirePHP を試すことができます。ここに ガイド があります。

DebugKit を試すこともできますが、私の頭上では、デバッグ2を動作させるためにまだ必要だと思います。

うまくいけば、何かがあなたにリードを与えるかもしれません。 :)

2
David Yell

これを使用できます:

$log = $this->Model->getDataSource()->getLog(false, false);

pr($log);die;
1
ajeet

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'); ?>
_
1
krishna ragav