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

根据 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 语句,而对性能的影响为零,这与分析器不同。

于 2012-04-19T16:52:34.760 回答