【问题标题】:How to squeeze error message out of PDO? [duplicate]如何从 PDO 中挤出错误消息? [复制]
【发布时间】:2011-04-13 04:39:43
【问题描述】:

我似乎无法从 PDO 收到任何错误消息:

#$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
try {
  $sth = $dbh->prepare('@$%T$!!!');
  print_r($sth);
  print_r($dbh->errorInfo());
} catch (PDOException $e) {
    echo $e->getMessage();
}

它只是给出:

PDOStatement Object
(
    [queryString] => @$%T$!!!
)
Array
(
    [0] => 00000
    [1] =>
    [2] =>
)

setAttribute 没有任何帮助。

这是 PHP 5.3.3 Apache 2.0 处理程序
已启用 MySQL 的 PDO 驱动程序
客户端 API 版本 mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $

如何获取错误信息?

【问题讨论】:

  • print_r($sth->errorInfo()) 打印出什么?
  • @shamittomar 我也试过了,它给出了一个由 3 个空元素组成的数组

标签: php error-handling pdo


【解决方案1】:

setAttribute 导致 PDO 抛出错误或异常 - 您执行查询时的最新情况。

对于模拟的预处理语句,prepare() 中没有检查:

模拟的预处理语句不与数据库服务器通信,因此 PDO::prepare() 不检查语句。

但是当查询被发送到服务器时,execute() 中会有一个。

然而,自 mySQL 4.1 以来,mySQL 驱动程序支持本机准备语句,因此这不应该适用。使用

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

必须导致您使用的查询出现异常。

【讨论】:

  • 手册页示例也不执行:ru2.php.net/manual/en/pdo.errorinfo.php 并且执行仍然没有运气
  • @Col 如果你设置$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );会怎么样?
  • @Col 如果你设置了ERRMODE_EXCEPTION 并且prepare()exec() 都没有例外,那么还有其他问题 - 在这种情况下,我不知道是什么
  • 这个有效。请将其添加到答案中,以便我接受。虽然它仍然让我感到困惑,但为什么 errorInfo() 不起作用
  • Mysql PDO 的模拟准备语句似乎在默认情况下处于打开状态....出于某种原因。您必须明确关闭仿真。
【解决方案2】:

我也试图在数据库句柄级别从 errorInfo() 获取信息,但我最终从 PDOStatement::errorInfo() 的语句级别获取信息

每个 PHP 网站:

PDO::errorInfo() 仅检索直接在数据库句柄上执行的操作的错误信息。如果您通过 PDO::prepare() 或 PDO::query() 创建 PDOStatement 对象并在语句句柄上调用错误,则 PDO::errorInfo() 将不会反映语句句柄中的错误。您必须调用 PDOStatement::errorInfo() 来返回对特定语句句柄执行的操作的错误信息。

【讨论】:

    【解决方案3】:

    这将打印错误代码及其相应的详细消息。

    建议:这只是一个演示。仅用于调试目的。不要启用在发布版本中向公众显示错误消息。

    try{
    connection=$this->get_connection();//here i brought my connection string
    connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    /**
    Do your works here..
    //$statement=$connection->prepare($sql);
    //if you are using errorInfo use after prepare statement before execute.here in this method i am not using it.
    //print_r($statement->errorInfo());
    **/
    
    $statement->execute();
    }
    catch(PDOException $e) {
                  //this will echo error code with detail
                  //example: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'nasme' in 'field list'
                  echo $e->getMessage();
                }
    //$statement=null;
    

    【讨论】:

    • 我不明白为什么我的答案被编辑得如此糟糕,因为我们知道这是如何做某事的演示。这是在调试代码时完成它的唯一方法。它显示带有错误代码的详细错误消息。现在我似乎没有这个答案:/为什么不删除它..
    • 啊,你已经恢复了原始代码——很公平。如果它以再次改变您意图的方式被修改,请举起主持人标志而不是参与编辑战 - 谢谢。我会修改全部大写的 - 我们在这里有一个“禁止大喊大叫”的规则:-)
    • @YourCommonSense:请不要理会这个答案。它已经有一个版主报告。如果您对解决方案有一些反馈,请随时扩展您在评论中提供的链接。
    【解决方案4】:

    您需要先execute查询然后检查错误:所以这样做:

     $sth->execute();
    

    然后检查错误。然后你会得到错误,如果有的话。

    【讨论】:

    • 这毕竟是问题所在。为什么将其发布为答案,而不是评论?为什么它会得到如此多的支持?
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多