Zend framework Zend框架“;无效参数编号:未绑定任何参数";获取有问题的sql

Zend framework Zend框架“;无效参数编号:未绑定任何参数";获取有问题的sql,zend-framework,pdo,Zend Framework,Pdo,我继承了一个使用Zend Framework构建的大型站点。这是一个公司内部网站,许多员工一直在抱怨错误。最后一个家伙只回答了一句“这对我来说很好”,因此他被解雇了 我做了一些研究,发现我可以制作一个错误句柄控制器。因此,我创建了一个捕获所有错误的程序,并在出现错误时对其进行了修复(现在我明白了为什么那个家伙说这对我来说很好,因为员工在某些事情上搞砸了,而那个家伙只是没有编程逻辑来处理这些错误) 现在我只处理了几个“无效参数编号:没有绑定参数”错误,我有堆栈跟踪,所以我知道是哪一行导致了错误。我

我继承了一个使用Zend Framework构建的大型站点。这是一个公司内部网站,许多员工一直在抱怨错误。最后一个家伙只回答了一句“这对我来说很好”,因此他被解雇了

我做了一些研究,发现我可以制作一个错误句柄控制器。因此,我创建了一个捕获所有错误的程序,并在出现错误时对其进行了修复(现在我明白了为什么那个家伙说这对我来说很好,因为员工在某些事情上搞砸了,而那个家伙只是没有编程逻辑来处理这些错误)

现在我只处理了几个“无效参数编号:没有绑定参数”错误,我有堆栈跟踪,所以我知道是哪一行导致了错误。我还有GET和POST值。导致抛出此错误的一些点有很多逻辑。所以我想知道如果我可以检索正在运行的SQL语句,Zend_Controller_Plugin_ErrorHandler是否有办法


我知道我可以把电话包起来,独立接听,但这无助于将来出现的问题。如能对此有所了解,将不胜感激

如果您使用的是PHP5.3,请尝试从您的异常中获取上一个异常


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

根据Rob所说

我进入并修改了Zend_Db_异常类。并补充说

public $_stmt = null;
然后在Zend_Db_语句_异常类中,我将u构造更改为:

    /**
 * @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_语句_Pdo类中,我更改了所有

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

然后在我的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 core的这一更改,我现在能够捕获所有有问题的SQL语句,对性能没有影响,这与profiler不同。

之前的异常不起作用,但Zend_DB_profiler确实起作用,尽管它产生了问题。在某些路段,它将系统速度降低了5秒,降至1分钟。所以我不得不禁用探查器。我很惊讶它会让你慢下来这么多,因为它不会做很多事情!然而,在这种情况下,您只剩下monkey修补Zend_DB代码。找到调用异常的代码行,并在该点添加一个日志,以在该特定代码段的上下文中存储您可以存储的任何内容。
    $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)
    {   }