【问题标题】:How to get more information from PDO failure "Error!: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined"?如何从 PDO 故障“错误!:SQLSTATE [HY093]:无效参数号:未定义参数”中获取更多信息?
【发布时间】:2012-09-19 21:53:09
【问题描述】:

每隔一段时间,我都会收到类似 PDO 的错误:

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

有没有什么方法可以得到更具体的错误,比如行号、文件名、缺少的参数等,而不是模糊的消息?

【问题讨论】:

  • 设置 PDO 以引发异常 ($pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);)。这将导致您的应用程序死亡并在它发生时转储堆栈跟踪 - 我这样做是理所当然的,并将每个 PDO 操作/操作集包装在 try/catch 中,并酌情进行错误处理。但坦率地说,如果您的错误日志没有记录文件/行号并且您需要这样做,那么它并不重要。
  • @DaveRandom - 我已经设置了这些设置,并且我的查询位于 try/catch 块中。我想这就是我遇到错误的原因。
  • 那么在这种情况下,大概你在catch 块中做类似echo $e->getMessage() 的事情?那么将其改为echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine();,您将获得所需的信息。见php.net/manual/en/class.exception.php
  • @DaveRandom - 谢谢,这很有帮助!你想把它作为答案发布吗?

标签: php error-handling pdo


【解决方案1】:

首先,确保您已将 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();

}

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

附带说明,如果将 PDO 与 MySQL 一起使用,请确保禁用模拟预准备语句。 See here 了解有关如何执行此操作以及为什么要执行此操作的更多信息。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2022-01-10
      • 1970-01-01
      • 2022-08-05
      • 2017-06-10
      相关资源
      最近更新 更多