Php 如何从PDO故障中获取更多信息”;错误!:SQLSTATE[HY093]:参数编号无效:未定义参数";?

Php 如何从PDO故障中获取更多信息”;错误!:SQLSTATE[HY093]:参数编号无效:未定义参数";?,php,error-handling,pdo,Php,Error Handling,Pdo,每隔一段时间,我就会收到一个错误,例如PDO的以下错误: 错误!:SQLSTATE[HY093]:参数编号无效:未定义参数 是否有任何方法可以获得更具体的错误,例如行号、文件名、缺少的参数等,而不是模糊的消息?您可以做的是注册全局错误处理程序和全局异常处理程序。这些函数接收文件名、行号和错误消息。在这些功能中,将数据回显到屏幕和模具上。首先,确保已将PDO设置为在出错时引发异常: $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCE

每隔一段时间,我就会收到一个错误,例如PDO的以下错误:

错误!:SQLSTATE[HY093]:参数编号无效:未定义参数


是否有任何方法可以获得更具体的错误,例如行号、文件名、缺少的参数等,而不是模糊的消息?

您可以做的是注册全局错误处理程序和全局异常处理程序。这些函数接收文件名、行号和错误消息。在这些功能中,将数据回显到屏幕和模具上。

首先,确保已将PDO设置为在出错时引发异常:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
现在,确保每个PDO操作/操作集都包含一个
try
/
catch
块,如下所示:

try {

  $stmt = $pdo->prepare("SELECT * FROM Whatever");
  // ...yada yada yada, your PDO code goes here

} catch (PDOException $e) {

  // This will echo the error message along with the file/line no on which the
  // exception was thrown. You could e.g. log the string to a file instead.
  echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine();

}
所有异常都从基类扩展而来,因此继承基类的方法以及它携带的有关错误的信息


另外,如果将PDO与MySQL一起使用,请确保禁用模拟的准备语句。有关如何执行此操作以及为什么要执行此操作的详细信息。

设置PDO以引发异常(
$PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
)。这将导致你的应用程序死亡,并在发生时转储堆栈跟踪-我当然会这样做,并将每个PDO操作/操作集包装在一个try/catch中,并酌情进行错误处理。但是坦率地说,如果您的错误日志没有记录文件/行no,并且您需要这样做,那么这并没有多大用处。@DaveRandom-我已经设置了这些设置,并且我的查询在try/catch块中。我想这就是我出错的原因。在这种情况下,您可能正在
catch
块中执行类似
echo$e->getMessage()
的操作?我们将其更改为“$e->getMessage()”中的“$e->getFile().”第“$e->getLine()行上的“
echo$e->getMessage()”
相反,您将获得所需的信息。请看@DaveRandom-谢谢,这非常有帮助!你想把它作为一个答案吗?