CakePHP - получить последний запрос - PullRequest
43 голосов
/ 26 марта 2010

Я хочу получить последний запрос, который CakePHP выполнил. Я не могу включить отладку в core.php и не могу запустить код локально. Мне нужен способ получить последний SQL-запрос и записать его в журнал ошибок, не затрагивая живой сайт. Этот запрос не выполняется, но выполняется.

что-то вроде этого было бы здорово:

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

Заранее спасибо.

Ответы [ 9 ]

46 голосов
/ 18 апреля 2012

Для Cake 2.0 журнал запросов защищен, поэтому он будет работать

function getLastQuery() {
  $dbo = $this->getDatasource();
  $logs = $dbo->getLog();
  $lastLog = end($logs['log']);
  return $lastLog['query'];
}
30 голосов
/ 25 февраля 2014

Проверено в CakePHP v2.3.2

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
29 голосов
/ 26 марта 2010

В CakePHP 1.x нужные данные доступны в DataSource::_queriesLog. На самом деле Cake не предоставляет метод получения для этого члена, но основным языком является PHP, ничто не мешает вам сделать следующее:

В app/app_model.php:

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

    return end($logs);
}
3 голосов
/ 17 марта 2016

Просто вы можете использовать функцию showLog ()

var_dump($this->YourModel->getDataSource()->showLog());
3 голосов
/ 07 марта 2015

Комбинация решения Мэтта и Блавии (работает, когда отладки не 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 голосов
/ 10 декабря 2010

Это очень поздний ответ, я знаю, но для тех, кому это понадобится в будущем, вы всегда можете ограничить настройку отладки своим IP, например:

Configure::write('debug', 0);
if($_SERVER["REMOTE_ADDR"] == '192.168.0.100'){
Configure::write('debug', 2); //Enables debugging only for your IP.
}
3 голосов
/ 26 марта 2010

Вы можете использовать это встроенное.

$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;
2 голосов
/ 26 марта 2010

Имея быстрый просмотр книги, cakephp api getLog вы можете включить logTransaction. Хотя я не использовал его, я не уверен, как он будет работать.

В противном случае вы можете поэкспериментировать с FirePHP и вот руководство по для него ,

Вы можете попробовать DebugKit , хотя мне кажется, что вам все еще нужна отладка 2, чтобы заставить его работать.

Надеюсь, что-то может дать вам преимущество. :)

1 голос
/ 22 декабря 2016

Вы можете использовать это:

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

pr($log);die;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...