Ответ 1
Для Cake 2.0 журнал запросов защищен, поэтому он будет работать
function getLastQuery() {
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Я хочу получить последний запрос 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);
}
Вы можете использовать эту встроенную строку.
$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;
Это очень поздний ответ, я знаю, но для тех, кому это нужно в будущем, вы всегда можете ограничить настройку отладки на свой IP, например:
Configure::write('debug', 0);
if($_SERVER["REMOTE_ADDR"] == '192.168.0.100'){
Configure::write('debug', 2); //Enables debugging only for your IP.
}
Комбинация решения Matt и blavia (работает, когда отладка не 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());
Имея быстрый обезжиренное книги, CakePHP апи getLog вы можете включить logTransaction
. Хотя я не использовал его, я не уверен, как он будет работать.
В противном случае вы можете поэкспериментировать с FirePHP, и вот руководство для него,
Вы можете попробовать DebugKit, хотя мне кажется, что вам все еще нужен отладчик 2, чтобы он заработал.
Надеюсь, что-то может дать вам руководство. :)
Вы можете использовать это:
$log = $this->Model->getDataSource()->getLog(false, false);
pr($log);die;
Есть два способа просмотра запроса в CakePHP.
Оба метода вы должны добавить одну строку ниже в app/Config/core.php
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'];
}
Второй метод:
добавьте строку ниже в любые файлы элементов.
<?php echo $this->element('sql_dump'); ?>
Это поможет вам.
echo '<pre>';
$log = $this->YOUR_MODEL->getDataSource();
print_r($log);
exit;