Php 如何在zend framework中打印精确的sql查询?

Php 如何在zend framework中打印精确的sql查询?,php,mysql,zend-framework,zend-db,Php,Mysql,Zend Framework,Zend Db,我有下面一段代码,是从模型中提取的 ... $select = $this->_db->select() ->from($this->_name) ->where('shipping=?',$type) ->where('customer_id=?',$userid);

我有下面一段代码,是从模型中提取的

    ...
                  $select = $this->_db->select()
                    ->from($this->_name)
                    ->where('shipping=?',$type)
                    ->where('customer_id=?',$userid);
                 echo  $select; exit; // which gives exact mysql query.
            .....
当我在zend like中使用更新查询时

$up_value = array('billing'=> '0');
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);      
$up_value=array('billing'=>'0');
$this->update($up_值,'customer_id=.$userid.'和address_id'.$data['address_id']);
这里我想知道确切的mysql查询。有没有可能在zend中打印mysql查询?请建议使用以下方法:-

echo $select->query();


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

或者,您可以启用它,它将以一种整洁的格式在Firebug中生成所有查询(甚至更新语句)

编辑
在FF6.0+中也可以使用FireHP进行评测(不仅仅是链接中建议的FF3.0)

选择对象在Zend Framework中有一个_toString()方法

从Zend框架手册:

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

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

// The output is the string:
//   SELECT * FROM "products"
另一种解决方案是使用Zend_Db_分析器。 i、 e

$db->getProfiler()->setEnabled(true);
//你的代码
$this->update($up_值,'customer_id=.$userid.'和address_id'.$data['address_id']);
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);

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

我浏览了数百页,在谷歌上搜索了很多,但我没有找到任何确切的解决方案。 这终于对我起作用了。无论您在控制器或模型中的哪个位置。这个代码在任何地方都适用于我。就用这个

//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;
这东西终于对我起作用了。

你可以打印

print_r($select->assemble());
从>=2.1.4

echo $select->getSqlString()
例如:

$select = $this->sql->select();
...
$select->from(array( 'u' => 'users' ));
$select->join(...
$select->group('u.id');
...
$statement = $this->sql->getSqlStringForSqlObject($select);
echo $statement;
现在请看Zend2:

$select->getSqlString();

我是这样做的

$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();
甚至更短:

echo $select->__toString()."\n";
更多更短:

echo  $select .""; die;
这个来自(即更新):

(额外)我在自己的模型文件中使用此文件:

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

祝您愉快:)

如果您正在使用占位符,则从探查器或查询对象返回的查询将具有占位符

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

这将列出自启用以来已运行的所有查询。 采集样本后,别忘了禁用此功能。 在活动服务器上;此日志可以很快填满。

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

SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;
然后运行查询。 结果存储在“mysql.general_log”表中

要禁用查询日志,请执行以下操作:

SET GLOBAL general_log = 0;
要验证它是否已关闭,请执行以下操作:

SHOW VARIABLES LIKE 'general%';

这帮助我找到了一个占位符没有被zend db替换的查询。使用探查器无法看到这一点。

谢谢vascowhite。但是我需要知道更新mysql查询格式,而不是选择查询格式。如何打印此“$this->update…”我认为SQL不会存储在任何地方,它是生成和执行的。谢谢,但只有第二种方法
Zend_Debug::dump($select->query()
WorkedTanks,我需要在zend framwork中打印更新查询。如何像选择对象那样执行。我们是否有方法在zend
调用未定义的方法zend\Db\sql\select::\uu toString()中打印更新方法的sql查询
关于
Zend DB 2.8.2
你是怎么知道这一点的?这不是一个好的解决方案。它以错误的格式引用了你的所有值。@RajeshPatel如果你用`
die($select);
替换“Mysql”,它应该成为有效的Mysql;甚至更多。好的,它会自动触发
\uu toString()
,但我更喜欢
var\u dump($select);死;
中庸!
echo $update->getSqlString();
echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);
SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;
SELECT * FROM mysql.general_log
SET GLOBAL general_log = 0;
SHOW VARIABLES LIKE 'general%';