如何在 Zend Framework 中打印精确的 SQL 查询?

78

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

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

当我在Zend中使用update查询时,

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

这里我想知道确切的MySQL查询语句。有没有可能在Zend中打印出MySQL查询语句?请给予指导。

14个回答

139

在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 Framework中打印更新查询。我该如何像选择对象一样做?我们是否有任何方法可以打印出Zend中更新方法的SQL查询? - mymotherland
Call to undefined method Zend\Db\Sql\Select::__toString() on Zend DB 2.8.2 - Powerriegel
另一种方法是,而不是使用__toString(),可以强制对象以字符串形式呈现:echo (string) $select; - Yvan

27

从版本2.1.4及以上可用

echo $select->getSqlString()

你是怎么知道这个的? - Pratik Joshi
1
这不是一个好的解决方案...它以错误的格式引用了你所有的值。 - Rajesh Patel
1
@RajeshPatel 如果你用 ` 替换 ",它就会变成有效的 MySQL 语句。 - Murray Wynnes

16

我翻遍了数百页,做了很多谷歌搜索,但是没有找到确切的解决方案。 最终,这个方法对我起作用了。无论你在控制器还是模型中,这段代码都适用于我。只需使用这个就可以了。

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

最后这个东西对我起作用了。


8
您可以使用Zend_Debug::Dump($select->assemble());来获取SQL查询语句。
或者您可以启用Zend DB FirePHP profiler,它将以整齐的格式在Firebug中提供所有查询结果(包括UPDATE语句)。 编辑: 使用FirePHP进行分析也适用于FF6.0+(不仅限于FF3.0,如链接所建议)。

4

2

您可以打印..

print_r($select->assemble());

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;

1
这段来自Zend Framework documentation(即更新)的内容:
echo $update->getSqlString();

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

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

祝您有愉快的一天 :)

1
更短的版本:
echo $select->__toString()."\n";

更短的内容:

更多

echo  $select .""; die;

die($select); 更甚。 - Sonu Bamniya
好的,它将自动触发 __toString(); 但我更喜欢 var_dump($select);die; 这是一个折中! - Vladimir Ch

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接