Zend framework Zend框架“;无效参数编号:未绑定任何参数";获取有问题的sql
我继承了一个使用Zend Framework构建的大型站点。这是一个公司内部网站,许多员工一直在抱怨错误。最后一个家伙只回答了一句“这对我来说很好”,因此他被解雇了 我做了一些研究,发现我可以制作一个错误句柄控制器。因此,我创建了一个捕获所有错误的程序,并在出现错误时对其进行了修复(现在我明白了为什么那个家伙说这对我来说很好,因为员工在某些事情上搞砸了,而那个家伙只是没有编程逻辑来处理这些错误) 现在我只处理了几个“无效参数编号:没有绑定参数”错误,我有堆栈跟踪,所以我知道是哪一行导致了错误。我还有GET和POST值。导致抛出此错误的一些点有很多逻辑。所以我想知道如果我可以检索正在运行的SQL语句,Zend_Controller_Plugin_ErrorHandler是否有办法Zend framework Zend框架“;无效参数编号:未绑定任何参数";获取有问题的sql,zend-framework,pdo,Zend Framework,Pdo,我继承了一个使用Zend Framework构建的大型站点。这是一个公司内部网站,许多员工一直在抱怨错误。最后一个家伙只回答了一句“这对我来说很好”,因此他被解雇了 我做了一些研究,发现我可以制作一个错误句柄控制器。因此,我创建了一个捕获所有错误的程序,并在出现错误时对其进行了修复(现在我明白了为什么那个家伙说这对我来说很好,因为员工在某些事情上搞砸了,而那个家伙只是没有编程逻辑来处理这些错误) 现在我只处理了几个“无效参数编号:没有绑定参数”错误,我有堆栈跟踪,所以我知道是哪一行导致了错误。我
我知道我可以把电话包起来,独立接听,但这无助于将来出现的问题。如能对此有所了解,将不胜感激 如果您使用的是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)
{ }