Подтвердить что ты не робот

CakePHP - запуск последнего запроса

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

Ответ 2

Протестировано в CakePHP v2.3.2

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

Ответ 3

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

В app/app_model.php:

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

    return end($logs);
}

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Комбинация решения 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;

Ответ 7

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

var_dump($this->YourModel->getDataSource()->showLog());

Ответ 8

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

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

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

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

Ответ 9

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

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

pr($log);die;

Ответ 10

Есть два способа просмотра запроса в 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'); ?>

Ответ 11

Это поможет вам.

echo '<pre>';
$log = $this->YOUR_MODEL->getDataSource(); 
print_r($log);
exit;