如何在zend框架中打印确切的sql查询?


71

我有以下代码是我从模型中获取的,

    ...
                  $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查询吗?友善的建议

Answers:


129

选择对象在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/zh/zend.db.select.html


谢谢,我需要在zend框架中打印更新查询。我该如何像选择对象那样做。我们是否有任何方法可以在zend中打印更新方法的sql查询
mymotherland 2011年

Call to undefined method Zend\Db\Sql\Select::__toString()Zend DB 2.8.2
山茱萸


16

我遍历了数百页,在Google上搜索了很多,但是我没有找到任何确切的解决方案。终于这对我有用。无论您在控制器或模型中的位置。这段代码在任何地方都对我有用。只是用这个

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

终于,这东西对我有用。


6

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

或者,您可以启用Zend DB FirePHP Profiler,它将以Firebug(甚至是UPDATE语句)的整洁格式为您提供所有查询。

编辑:使用FirePHP进行分析也可以在FF6.0 +中使用(不仅在FF3.0中如链接中所述)




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;


0

用这个:-

echo $select->query();

要么

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

谢谢vascowhite。但是我需要知道更新mysql查询格式而不是选择查询format.how如何打印此“ $ this-> update ....”
mymotherland 2011年

我认为SQL不会存储在任何地方,而是生成和执行的。
vascowhite

谢谢,但只有Zend_Debug::dump($select->query();
第二种


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();

0

这来自Zend Framework文档(即UPDATE):

echo $update->getSqlString();

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

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

祝你今天愉快 :)


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替换占位符的查询。剖析器看不到它。


-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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.