简体   繁体   English

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

[英]How to print exact sql query in zend framework ?

I have the following piece of code which i taken from model, 我有以下代码是我从模型中获取的,

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

When i use update query in zend like , 当我在zend中使用更新查询时,

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

Here i want to know the exact mysql query. 在这里我想知道确切的mysql查询。 Is there any possible way to print the mysql query in zend ? 有什么办法可以在zend中打印mysql查询吗? kindly advice 好心劝告

Select objects have a __toString() method in Zend Framework. 选择对象在Zend Framework中具有__toString()方法。

From the Zend Framework manual: 从Zend Framework手册中:

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

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

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

An alternative solution would be to use the Zend_Db_Profiler. 另一种解决方案是使用Zend_Db_Profiler。 ie

$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 http://framework.zend.com/manual/zh/zend.db.select.html

从> = 2.1.4

echo $select->getSqlString()

I have traversed hundred of pages, googled a lot but i have not found any exact solution. 我遍历了数百页,在Google上搜索了很多,但是我没有找到任何确切的解决方案。 Finally this worked for me. 终于这对我有用。 Irrespective where you are in either controller or model. 无论您在控制器或模型中的位置。 This code worked for me every where. 这段代码在任何地方都对我有用。 Just use this 只是用这个

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

Finally this thing worked for me. 终于,这东西对我有用。

You can use Zend_Debug::Dump($select->assemble()); 您可以使用Zend_Debug::Dump($select->assemble()); to get the SQL query. 获取SQL查询。

Or you can enable Zend DB FirePHP profiler which will get you all queries in a neat format in Firebug (even UPDATE statements). 或者,您可以启用Zend DB FirePHP Profiler ,它将在Firebug中以整洁的格式(甚至是UPDATE语句)为您提供所有查询。

EDIT : Profiling with FirePHP also works also in FF6.0+ (not only in FF3.0 as suggested in link) 编辑 :使用FirePHP进行性能分析也可以在FF6.0 +中使用(不仅在FF3.0中如链接中所述)

Now on Zend2: 现在在Zend2上:

$select->getSqlString();

Displaying the generated SQL from ZendDbSql object 显示从ZendDbSql对象生成的SQL

你可以打印..

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

echo "SQL statement: $statement";

Example: 例:

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

even shorter: 甚至更短:

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

and more shorter: 短:

echo  $select .""; die;

I have done this by this way 我是这样做的

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

This one's from Zend Framework documentation (ie. UPDATE): 这来自Zend Framework文档 (即UPDATE):

echo $update->getSqlString();

(Bonus) I use this one in my own model files: (奖金)我在自己的模型文件中使用了这个:

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

Have a nice day :) 祝你今天愉快 :)

The query returned from the profiler or query object will have placeholders if you're using those. 从分析器或查询对象返回的查询将具有占位符(如果使用的话)。

To see the exact query run by mysql you can use the general query log. 要查看由mysql运行的确切查询,可以使用常规查询日志。

This will list all the queries which have run since it was enabled. 这将列出自启用以来已运行的所有查询。 Don't forget to disable this once you've collected your sample. 收集样本后,不要忘记禁用此功能。 On an active server; 在活动服务器上; this log can fill up very fast. 该日志可以很快填满。

From a mysql terminal or query tool like MySQL Workbench run: 从mysql终端或查询工具(如MySQL Workbench)运行:

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

then run your query. 然后运行查询。 The results are stored in the "mysql.general_log" table. 结果存储在“ mysql.general_log”表中。

SELECT * FROM mysql.general_log

To disable the query log: 要禁用查询日志:

SET GLOBAL general_log = 0;

To verify it's turned off: 要验证它是否已关闭:

SHOW VARIABLES LIKE 'general%';

This helped me locate a query where the placeholder wasn't being replaced by zend db. 这帮助我找到了一个未用zend db替换占位符的查询。 Couldn't see that with the profiler. 剖析器看不到它。

Use this:- 用这个:-

echo $select->query();

or 要么

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

Check out the Zend_Db_Profiler . Zend_Db_Profiler This allows you to log any SQL statement as it is prepared and executed. 这样,您就可以在准备和执行任何SQL语句时记录它。 It works for UPDATE statements as well as SELECT queries. 它适用于UPDATE语句以及SELECT查询。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM