0

Zend Framework を使用して構築された、継承された大規模なサイトがあります。これは社内サイトであり、多くの従業員がエラーを訴えています。最後の男は「私にとってはうまくいっている」としか答えなかったので、解雇されたのです。

いくつかの調査を行った結果、エラー ハンドル コントローラーを作成できることがわかりました。だから私はすべてのエラーをキャプチャしたものを作成し、それらが発生したときにそれらを修正しました(そして、従業員が何かを台無しにしていたのに、男がそうしなかったため、私にとってはうまくいくと男が言っている理由がわかりましたそれらの失敗を処理するロジックがプログラムされています)。

現在、「無効なパラメーター番号: パラメーターがバインドされていません」というエラーがいくつか発生しました。スタック トレースがあるので、どの行がエラーを引き起こしているかがわかります。GET と POST の値もあります。このエラーがスローされるポイントのいくつかには、それに至るまでの多くのロジックがあります。したがって、Zend_Controller_Plugin_ErrorHandler から実行中の SQL ステートメントを取得できる方法があるかどうか疑問に思っています。

呼び出しをラップして個別にキャッチできることはわかっていますが、それは今後発生する問題の助けにはなりません。これについての洞察は大歓迎です。

4

2 に答える 2

1

PHP 5.3 を使用している場合は、持っている例外から前の例外を取得してみてください。

そうでない場合は、Zend_Db_Profilerを使用してクエリをログに記録し、エラー コントローラでそれらをすべて取得します。ただし、おそらくエラーを手動で一致させる必要があります。

于 2012-04-18T14:37:06.743 に答える
0

ロブが言ったことに基づいて、

入って、Zend_Db_Exceptionクラスを変更しました。と追加

public $_stmt = null;

次に、Zend_Db_Statement_Exceptionクラスで、__constructを次のように変更しました。

    /**
 * @param string $message
 * @param string|int $code
 * @param Exception $chainedException
     * @param Statment i.e. Query String
 */
public function __construct($message = null, $code = null, Exception $chainedException=null, $_stmt = null)
{
    $this->message = $message;
    $this->code = $code;
    $this->_chainedException = $chainedException;
        $this->_stmt = $_stmt;
}

次に、Zend_Db_Statement_Pdoクラスで、すべての

throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);

throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e, $this->_stmt);

次に、Zend_Controller_Plugin_ErrorHandlerアクションの横で、これを先導します。

    $errors = $this->_getParam('error_handler');
    switch ($errors->type) {
        case "EXCEPTION_NO_ROUTE":
        case "EXCEPTION_NO_CONTROLLER":
        case "EXCEPTION_NO_ACTION":
            // 404 error -- controller or action not found
            $this->view->title = "Page Not Found";
            break;
        default:
            $this->view->title = "Unknown Error";
            break;
    }

    $sql = null;
    $offending_query = null;
    $exception = $errors->exception;
    try
    {
        $offending_query = $exception->_stmt->queryString;
    }
    catch (Zend_Exception $e)
    {   }

このZendDBコアの変更により、プロファイラーとは異なり、パフォーマンスへの影響をゼロにして、問題のあるSQLステートメントをすべてキャプチャできるようになりました。

于 2012-04-19T16:52:34.760 に答える