2012-04-18 17 views
0

Zend Frameworkを使用して継承した大規模なサイトがあります。社内のサイトであり、多くの従業員がエラーを訴えています。最後の男は "それは私のためにうまく働いている"という応答を与えただけで、なぜ彼は解雇されたのですか?Zend Framework "無効なパラメータ番号:バインドされたパラメータがありません" SQLに怒っています

私はいくつかの調査を行い、エラー処理コントローラを作ることができることを発見しました。だから私はすべてのエラーをキャプチャしたものを作成し、私は彼らが来るようにそれらを修正している(と私は今、なぜ男はそれが私のために働く、従業員の何かに台無しにしていたと男はちょうどそれらのネジアップを処理するためにロジックがプログラムされている)。

今は、「無効なパラメータ番号:パラメータがバインドされていません」というエラーが発生しました。スタックトレースがあるため、エラーの原因となっている行がわかります。私はまた、GET値とPOST値を持っています。このエラーの原因となっているポイントのいくつかは、それにつながる多くの論理を持っています。だから私は実行されているSQL文を取得できる場合、Zend_Controller_Plugin_ErrorHandlerからの方法があるかどうか疑問に思っています。

私はコールをラップして独立にキャッチできることは知っていますが、それは今後起こる問題を助けません。これについての洞察は非常に高く評価されます。

答えて

0

、私が行って、Zend_Db_Exceptionクラスを修正

。そして

public $_stmt = null; 

その後追加Zend_Db_Statement_Exceptionクラスで、私はこれに__constructを変更:

私は変更Zend_Db_Statement_Pdoクラスで次に
/** 
* @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; 
} 

すべて

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アクションでは、これを先導しています。

この変更をZend DBコアに追加することで、プロファイラとは違ってパフォーマンスに影響を与えることなく、問題のSQL文をすべて取得できるようになりました。

1

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

エラーメッセージが表示されない場合は、Zend_Db_Profilerを使用してクエリをログに記録し、すべてエラーコントローラで取得してください。あなたはおそらく手動でエラーに一致する必要があります。ロブが言ったことに基づいてい

+0

以前の例外は機能しませんでしたが、Zend_Db_Profilerは問題を引き起こしましたが動作しました。いくつかのセクションではシステムを5秒から1分に遅くしました。だから私はプロファイラを無効にしなければならなかった。 – Pyromanci

+0

私はそれが多くをしないので、それはあなたをそんなに遅くするのに驚いています!しかし、その場合は、Zend_DBコードにパッチを当てている猿が残っています。例外が呼び出されたコード行を見つけ、その特定のコードのコンテキスト内でできることを格納するためにその時点でログを追加します。 –

関連する問題