2013-05-27 28 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

首先,在app/config/config.php设置debug变量为2。

然后加:

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

在布局结束。这实际上应该在你的默认蛋糕布局中注释掉。

您现在将能够看到所有到数据库的SQL查询。

现在复制查询并在数据库中使用SQL EXPLAIN命令(链接用于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如果您使用this-> log或CakeLog – LogixMaster

4

一件事是....

转到蛋糕/型号/数据源/ 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 /蛋糕/型号的execute()得到所有的查询/ DataSource.php

Debugger::dump($sql); 
1

显示的所有执行查询简单方法你的给定模型:

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

设置调试变量2中的应用程序/配置/ config.php中。

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

输出like => SQL查询:INSERT INTO photoora_photoorangepayments VALUES(*******)

[插入查询] [2]