如何在zend框架中打印精确的SQL查询?

时间:2011-10-11 09:04:11

标签: php mysql zend-framework zend-db

我从模型中获取了以下代码

    ...
                  $select = $this->_db->select()
                    ->from($this->_name)
                    ->where('shipping=?',$type)
                    ->where('customer_id=?',$userid);
                 echo  $select; exit; // which gives exact mysql query.
            .....

当我在zend中使用更新查询时,

$up_value = array('billing'=> '0');
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);      

这里我想知道确切的mysql查询。有没有办法在zend中打印mysql查询?善意的建议

14 个答案:

答案 0 :(得分:116)

Select对象在Zend Framework中有一个__toString()方法。

来自Zend Framework手册:

$select = $db->select()
             ->from('products');

$sql = $select->__toString();
echo "$sql\n";

// The output is the string:
//   SELECT * FROM "products"

另一种解决方案是使用Zend_Db_Profiler。 即。

$db->getProfiler()->setEnabled(true);

// your code
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']); 

Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);

http://framework.zend.com/manual/en/zend.db.select.html

答案 1 :(得分:22)

来自&gt; = 2.1.4

echo $select->getSqlString()

答案 2 :(得分:14)

我已遍历了数百页,谷歌搜索了很多,但我还没有找到任何确切的解决方案。 最后这对我有用。无论您在控制器或型号中的哪个位置。这段代码适用于我的每一个地方。只需使用此

//Before executing your query
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$db->getProfiler()->setEnabled(true);
$profiler = $db->getProfiler();

// Execute your any of database query here like select, update, insert
//The code below must be after query execution
$query  = $profiler->getLastQueryProfile();
$params = $query->getQueryParams();
$querystr  = $query->getQuery();

foreach ($params as $par) {
    $querystr = preg_replace('/\\?/', "'" . $par . "'", $querystr, 1);
}
echo $querystr;

最后这件事对我有用。

答案 3 :(得分:6)

您可以使用Zend_Debug::Dump($select->assemble());来获取SQL查询。

或者您可以启用Zend DB FirePHP profiler,它会在Firebug中以简洁的格式提供所有查询(甚至是UPDATE语句)。

修改: 使用FirePHP进行性能分析也适用于FF6.0 +(不仅仅是在链接中建议的FF3.0中)

答案 4 :(得分:3)

现在在Zend2:

$select->getSqlString();

Displaying the generated SQL from ZendDbSql object

答案 5 :(得分:2)

你可以打印..

print_r($select->assemble());

答案 6 :(得分:1)

$statement = $this->sql->getSqlStringForSqlObject( HERE GOES Zend\Db\Sql\SelectSQL object );

echo "SQL statement: $statement";

示例:

$select = $this->sql->select();
...
$select->from(array( 'u' => 'users' ));
$select->join(...
$select->group('u.id');
...
$statement = $this->sql->getSqlStringForSqlObject($select);
echo $statement;

答案 7 :(得分:0)

使用: -

echo $select->query();

Zend_Debug::dump($select->query();

答案 8 :(得分:0)

查看Zend_Db_Profiler。这允许您在准备和执行时记录任何SQL语句。它适用于UPDATE语句以及SELECT查询。

答案 9 :(得分:0)

我这样做了

$sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from('mock_paper');
        $select->columns(array(
            'is_section'
        ));
        $select->where(array('exam_id = ?' => $exam_id,'level_id = ?' => $level_id))->limit(1);



        $sqlstring = $sql->buildSqlString($select);
        echo $sqlstring;
        die();

答案 10 :(得分:0)

更短:

echo $select->__toString()."\n";

更多更短:

echo  $select .""; die;

答案 11 :(得分:0)

从分析器或查询对象返回的查询将具有占位符(如果使用的话)。

要查看由mysql运行的确切查询,可以使用常规查询日志。

这将列出自启用以来已运行的所有查询。 收集样品后,请不要忘记禁用此功能。 在活动服务器上;该日志可以很快填满。

从mysql终端或查询工具(如MySQL Workbench)运行:

SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;

然后运行查询。 结果存储在“ mysql.general_log”表中。

SELECT * FROM mysql.general_log

要禁用查询日志:

SET GLOBAL general_log = 0;

要确认它已关闭:

SHOW VARIABLES LIKE 'general%';

这帮助我找到了一个没有被zend db代替的占位符的查询。剖析器看不到。

答案 12 :(得分:-1)

$db->getProfiler()->setEnabled(true);

// your code    
$this->update('table', $data, $where);    
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());    
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());    
$db->getProfiler()->setEnabled(false);

答案 13 :(得分:-1)

此人来自Zend Framework documentation(即UPDATE):

echo $update->getSqlString();

(奖金)我在自己的模型文件中使用了这个:

echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);

祝你有美好的一天:)