1

ZendFrameworkを使用する非常に大規模なWebアプリケーションがあります。どこかのSQLステートメントに構文エラーがあるようです(多くのものが自動的に生成されます)が、ログに記録されたエラーは非常に役に立ちません(プロジェクト情報が削除されました)

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near [...] in [...]/ZendFramework/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 [...]/ZendFramework/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 [...]/ZendFramework/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#2 [...]/ZendFramework/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#3 [...]/ZendFramework/Zend/Db/Adapter/ in [...]/ZendFramework/Zend/Db/Statement/Pdo.php on line 234

このスタックトレースには、Zend Framework内の参照のみが含まれており、実際の呼び出し元(構文エラーが発生する可能性が最も高い場所)はどこにも表示されません。

エラーが発生したときにZendFrameworkで完全なスタックトレースを取得するにはどうすればよいですか?

4

2 に答える 2

2

これらの例外は、通常はデフォルトモジュール(application / controllers / ErrorController.phpErrorController() )で(またはErrorControllerとして渡されるものは何でも)ログに記録される必要があります。この場合、ロギングメカニズムを変更するのは非常に簡単です。

必要な出力を取得するために使用する必要のあるException()メソッドを見つけるには、少し実験が必要な場合があります。

[編集]

デフォルトのエラー設定を使用している場合、ビューは簡単に更新できることに注意してください。

<!-- application/views/scripts/error/error.phtml -->
<html>
    <body>
        <h1>An error occurred</h1>
        <h2><?php echo $this->message ?></h2>
        <?php if (isset($this->exception)): ?>
            <h3>Exception information:</h3>
            <p>
                <b>Message:</b> <?php echo $this->exception->getMessage() ?>
            </p>
            <h3>Stack trace:</h3>
            <pre><?php echo $this->exception->getTraceAsString() ?>
            <!-- add full Trace info -->
            <pre><?php echo $this->exception->getTrace() ?></pre>
            </pre>
            <h3>Request Parameters:</h3>
            <pre><?php echo $this->escape(var_export($this->request->getParams(), true)) ?>
            </pre>
        <?php endif ?>
    </body>
</html>
于 2012-12-28T14:28:46.507 に答える
1

より詳細なスタックトレースが必要な場合は、次を使用できます。

foreach($this->exception->getTrace() as $t){
        var_dump($t);
    }

ここで言及。ただし、ここここ、およびここで役立つ記事で説明されているように、firebugとfirephpを使用し、Zend_Debug_Profiler_FirebugクラスでSQLクエリをデバッグする方がよいと思います。

于 2012-12-27T11:38:21.453 に答える