【问题标题】:How to print exact sql query in zend framework ?如何在 zend 框架中打印准确的 sql 查询?
【发布时间】:2011-10-11 09:04:10
【问题描述】:

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

    ...
                  $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 查询?好心的建议

【问题讨论】:

    标签: php mysql zend-framework zend-db


    【解决方案1】:

    选择对象在 Zend 框架中有一个 __toString() 方法。

    来自 Zend 框架手册:

    $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

    【讨论】:

    • 谢谢,我需要在 zend 框架中打印更新查询。我该怎么做就像选择对象一样。我们有什么方法可以在 zend 中打印更新方法的 sql 查询
    • Call to undefined method Zend\Db\Sql\Select::__toString() on Zend DB 2.8.2
    【解决方案2】:

    从 >= 2.1.4

    echo $select->getSqlString()
    

    【讨论】:

    • 你是怎么知道的?
    • 这不是一个好的解决方案..它以错误的格式引用你所有的值..
    • @RajeshPatel 如果你用`替换"应该成为有效的Mysql
    【解决方案3】:

    我已经浏览了数百页,谷歌了很多,但我没有找到任何确切的解决方案。 最后这对我有用。无论您在控制器或模型中的哪个位置。这段代码在任何地方都对我有用。就用这个

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

    最后这件事对我有用。

    【讨论】:

      【解决方案4】:

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

      或者您可以启用Zend DB FirePHP profiler,这将使您在 Firebug 中以简洁的格式获取所有查询(甚至是 UPDATE 语句)。

      编辑: 使用 FirePHP 进行分析也适用于 FF6.0+(不仅在链接中建议的 FF3.0 中)

      【讨论】:

        【解决方案5】:

        现在在 Zend2 上:

        $select->getSqlString();
        

        Displaying the generated SQL from ZendDbSql object

        【讨论】:

          【解决方案6】:

          你可以打印..

          print_r($select->assemble());
          

          【讨论】:

            【解决方案7】:
            $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;
            

            【讨论】:

              【解决方案8】:

              甚至更短:

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

              更多更短:

              echo  $select .""; die;
              

              【讨论】:

              • die($select); 更多。
              • 好的,它会自动触发__toString(); 但我更喜欢var_dump($select);die; 中庸之道!
              【解决方案9】:

              这个来自Zend Framework documentation(即更新):

              echo $update->getSqlString();
              

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

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

              祝你有美好的一天:)

              【讨论】:

                【解决方案10】:

                使用这个:-

                echo $select->query();
                

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

                【讨论】:

                • 感谢 vascowhite。但我需要知道更新 mysql 查询格式而不是选择查询格式。如何打印此“$this->update....”
                • 我不认为 SQL 存储在任何地方,它是生成并执行的。
                • 谢谢,但只有第二种方法 Zend_Debug::dump($select-&gt;query(); 有效
                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  我就是这样做的

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

                  【讨论】:

                    【解决方案13】:

                    从分析器或查询对象返回的查询将包含占位符(如果您使用它们)。

                    要查看 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 替换的查询。使用探查器无法看到。

                    【讨论】:

                      【解决方案14】:
                      $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);
                      

                      【讨论】:

                        猜你喜欢
                        • 2012-03-27
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-06-22
                        • 2021-08-02
                        • 2014-09-08
                        相关资源
                        最近更新 更多