0

自分のサイトでアプリケーション エラーが発生し、不正な SQL クエリに接続されている場合、問題を解決するためのクエリが知りたいです。しかし、それは簡単ではありません。このようなエラーが発生すると、次のような情報が表示されます。

エラーが発生しました

アプリケーションエラー

例外情報:

メッセージ: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'p.name' が 'where 句' にあります

スタックトレース:

#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 クエリをログに記録する方法は?

4

1 に答える 1

0

私は非常に複雑ですが、有用な解決策を見つけました。それは、次のコードを 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);
        }
      }

    }
于 2013-05-20T15:19:26.227 に答える