Zend framework 如何在Zend\u Db\u语句\u异常上记录Zend中的SQL查询

Zend framework 如何在Zend\u Db\u语句\u异常上记录Zend中的SQL查询,zend-framework,Zend Framework,当我的站点上发生应用程序错误,并且它与格式错误的SQL查询连接时,我想知道解决问题的查询。但这并不容易,当发生此类错误时,信息如下所示: 发生了一个错误 应用程序错误 例外信息: 消息:SQLSTATE[42S22]:未找到列:1054未知列 “where子句”中的“p.name” 堆栈跟踪: #0 /var/www/ksiegarnia/library/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array) #

当我的站点上发生应用程序错误,并且它与格式错误的SQL查询连接时,我想知道解决问题的查询。但这并不容易,当发生此类错误时,信息如下所示:

发生了一个错误

应用程序错误

例外信息:

消息:SQLSTATE[42S22]:未找到列:1054未知列 “where子句”中的“p.name”

堆栈跟踪:

#0 /var/www/ksiegarnia/library/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array)
#1 /var/www/ksiegarnia/library/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#2 /var/www/ksiegarnia/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Table_Select), Array)
#3 /var/www/ksiegarnia/library/Zend/Db/Select.php(686): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Table_Select))
#4 /var/www/ksiegarnia/library/Zend/Paginator/Adapter/DbSelect.php(142): Zend_Db_Select->query(2)
#5 /var/www/ksiegarnia/library/Zend/Paginator/Adapter/DbSelect.php(183): Zend_Paginator_Adapter_DbSelect->setRowCount(Object(Zend_Db_Table_Select))
#6 [internal function]: Zend_Paginator_Adapter_DbSelect->count()
#7 /var/www/ksiegarnia/library/Zend/Paginator.php(540): count(Object(Zend_Paginator_Adapter_DbTableSelect))
#8 /var/www/ksiegarnia/library/Zend/Paginator.php(1081): Zend_Paginator->getTotalItemCount()
#9 /var/www/ksiegarnia/library/Zend/Paginator.php(753): Zend_Paginator->_calculatePageCount()
#10 /var/www/ksiegarnia/application/modules/default/controllers/IndexController.php(702): Zend_Paginator->setItemCountPerPage(10)
#11 /var/www/ksiegarnia/library/Zend/Controller/Action.php(516): IndexController->searchadvancedAction()
#12 /var/www/ksiegarnia/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('searchadvancedA...')
#13 /var/www/ksiegarnia/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#14 /var/www/ksiegarnia/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#15 /var/www/ksiegarnia/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#16 /var/www/ksiegarnia/public_html/index.php(32): Zend_Application->run()
#17 {main}  

如何记录导致错误的SQL查询?

我发现了一个非常复杂但非常有用的解决方案,即向ErrorController.php添加以下代码: 当异常属于类Zend_Db_Statement_exception时,转到跟踪的特定行,获取在那里使用的Zend_Db_Select参数,并从中获取SQL子句的部分内容(where、from、order、group等),并将它们记录到日志文件中。讨厌,不是吗?;)但效果是:)

下面是要插入
ErrorController.php

    $thread_id = exec('echo $$');

    if (get_class($errors->exception) == 'Zend_Db_Statement_Exception') {
      $trace = $errors->exception->getTrace();

      foreach(array('columns', 'from', 'where', 'order', 'group', 'limitcount', 'limitoffset', 'union') as $queryPartName) {
        $parts = $trace[2]['args'][0]->getPart($queryPartName);
        if ((is_array($parts) && !empty($parts)) ||
            (!is_array($parts) && trim($parts) !== '')) {
          $log->log($thread_id. "\t".strtoupper($queryPartName) .': ', $priority);
          if (is_array($parts)) {
            foreach($parts as $part)
              $log->log($thread_id. "\t"."\t". (is_array($part) ? 'Array: '. implode(', ', $part) : $part), $priority);
          } else
            $log->log($thread_id. "\t"."\t". $parts, $priority);
        }
      }

    }