2013-05-27 5 views
12

Мой запрос получает ошибку тайм-аута при каждом прогоне. Его разбиение на страницы с объединениями.
Я хочу отлаживать SQL, но поскольку я получаю таймаут, я не вижу его.cakephp см. Скомпилированный SQL-запрос перед выполнением

Как я могу просмотреть скомпилированный SQL-запрос перед выполнением?


Некоторые торт код:

$this -> paginate = array(
     'limit' => '16', 
     'joins' => array(array(
       'table' => 'products', 
       'alias' => 'Product', 
       'type' => 'LEFT', 
       'conditions' => array('ProductModel.id = Product.product_model_id') 
      )), 
     'fields' => array(
      'COUNT(Product.product_model_id) as Counter', 
      'ProductModel.name' 
      ), 
     'conditions' => array(
      'ProductModel.category_id' => $category_id, 
     ), 
     'group' => array('ProductModel.id') 
    ); 

ответ

26

Во-первых, установить переменную debug 2 в app/config/config.php.

Затем добавить:

<?php echo $this->element('sql_dump');?> 

в конце макета. Это действительно должно быть прокомментировано в вашем макете торта по умолчанию.

Теперь вы сможете увидеть все SQL-запросы, которые идут в базу данных.

Теперь скопируйте запрос и используйте команду (ссылка для MySQL) по базе данных, чтобы узнать, что делает запрос в DBMS. Для получения дополнительной информации о проверке отладки CakePHP here.

Поскольку сценарий даже не делают, вы можете попробовать, чтобы получить последний журнал непосредственно из источника данных с:

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

Это должно быть в модели, так как функция getDatasource() определяется в модели. Осмотрите всю переменную $logs и посмотрите, что там находится. более

+0

спасибо. но он не работает. проблема заключается в том, что сценарий никогда не попадает в часть рендеринга, так как тайм-аут находится в уровне действия контроллера. – yossi

+0

Ответ обновлен. –

+0

И этот сценарий вернет последний запрос из предыдущего выполнения? – yossi

4
Try... 
function getLastQuery($model) { 
    $dbo = $model->getDatasource(); 
    $logData = $dbo->getLog(); 
    $getLog = end($logData['log']); 
    echo $getLog['query']; 
} 
+0

Эта функция хорошо работает на сервере с PHP 5.4.32, но не на сервере с 5.5.16 в этом случае $ dbo-> getLog() просто пуст. На другом сервере я получаю полные журналы. Любая идея, почему функция не работает на 5.5. версия? – user1555112

+0

@ user1555112 Я не уверен, в чем проблема, но он отлично работает на 5.6.1 –

+0

@ user1555112, возможно, вы отключили режим отладки в своей конфигурации, если вы используете этот-> журнал или CakeLog – LogixMaster

4

Одна вещь, которую вы можете сделать, это ....

Перейти к Cake/Model/DataSource/DboSource.php и найти функции Execute() и переменной печати $ SQL. Это должно печатать sql.

Это, конечно, не самый чистый способ (поскольку вы меняете каталог Cake) .. но, конечно, было бы быстрее всего отлаживать, если что-то не работает с sql.

+0

Когда все остальное полностью сломано из-за запроса-изгоев, это иногда самый полезный способ! – almcnicoll

+1

Ответ также полезен для сред командной строки, где у вас нет доступа к элементу 'sql_dump'. –

+0

Спасибо! Это помогло :) – olleh

1
class YourController extends AppController { 
    function testfunc(){ 
     $this->Model->find('all', $options); 
     echo 'SQL: '.$this->getLastQuery(); 
    } 

    function getLastQuery() 
    { 
     $dbo = ConnectionManager::getDataSource('default'); 
     $logs = $dbo->getLog(); 
     $lastLog = end($logs['log']); 
     return $lastLog['query']; 
    } 
} 

или вы можете получить все запросы, добавив следующую строку в функцию выполнения() в Lib/Cake/Model/DataSource.php

Debugger::dump($sql); 
1

Простой способ показать все выполняется запрос о ваша модель:

$sqllog = $this->ModelName->getDataSource()->getLog(false, false);  
    debug($sqllog); 
0

установить переменную отладочную 2 в приложение/Config/config.php.

echo $this->Payment->save(); 

вне положенное как => SQL Query: INSERT INTO photoora_photoorange. payments ЗНАЧЕНИЯ (*******)

[вставить запрос] [2]

Смежные вопросы