Zend Framework“参数号无效:没有参数绑定”得到违规的sql

时间:2012-04-18 14:27:51

标签: zend-framework pdo

我有一个我使用Zend Framework继承的大型网站。它是一个内部公司网站,许多员工一直在抱怨错误。最后一个人只回应了#34;它对我来说工作正常,因此他被解雇了。

我经历了一些研究并发现我可以制作错误句柄控制器。所以我创建了一个捕获所有错误的东西,并且当他们出现时我一直在修复它们(我现在明白为什么这个人说它对我来说很好,因为员工正在搞砸某些事情和那个人只是没有编程的逻辑来处理那些搞砸的事情。)

现在我完成了一些"无效的参数编号:没有参数绑定"错误,我有堆栈跟踪,所以我知道什么行导致错误。我也有GET和POST值。它导致抛出此错误的一些要点有很多逻辑导致它。所以,我想知道是否有一种方法来自Zend_Controller_Plugin_ErrorHandler,如果我可以检索正在运行的SQL语句。

我知道我可以打包电话并独立捕捉它们,但这不会有助于未来出现的问题。任何对此的见解将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您使用的是PHP 5.3,请尝试从您拥有的例外中获取先前的异常。

如果没有,请使用Zend_Db_Profiler并记录查询,然后在错误控制器中检索所有查询。您可能必须手动匹配错误。

答案 1 :(得分:0)

基于Rob所说的,

我进去并修改了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)
    {   }

通过对Zend DB核心的这一更改,我现在能够捕获所有违规的SQL语句,而不像分析器那样对性能产生零影响。