2012-04-18 63 views
0

我有一个我使用Zend Framework继承的大型网站。这是一个内部公司网站,许多员工一直在抱怨错误。最后一个人只给出了“对我来说工作很好”的回应,因此他被解雇了。Zend Framework“无效的参数编号:没有参数被绑定”得到违规的sql

我经历了一些研究,发现我可以制造一个错误手柄控制器。所以我创建了一个可以捕获所有错误的方法,并且在他们提出时我一直在解决它们(现在我明白了为什么这个人说我的工作正常,导致员工在某些事情上搞砸了,而那个人却没有有编程的逻辑来处理这些拧紧)。

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

我知道我可以打包电话,并单独捕捉它们,但这不会帮助未来出现的问题。任何洞察到这一点将不胜感激。

回答

0

围绕什么罗布说基础,

我去和修改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 I类变更

然后所有的

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语句。

1

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

如果不是,请使用Zend_Db_Profiler并记录查询,然后全部在错误控制器中检索它们。尽管如此,您可能必须手动匹配错误。

+0

以前的异常没有工作,但Zend_Db_Profiler确实工作,虽然它造成了问题。它在某些部分将系统减速了5秒到1分钟。所以我必须禁用分析器。 – Pyromanci 2012-04-18 19:44:03

+0

我很惊讶,它让你感觉很慢,因为它没有做太多!但是,在那种情况下,你只剩下猴子补丁的Zend_DB代码。找到调用异常的代码行,并在该位置添加一个日志,以便在该特定代码段的上下文中存储任何可以存储的内容。 – 2012-04-19 04:57:06

相关问题