如何从PDO中挤出错误信息?

时间:2010-09-16 12:08:46

标签: php error-handling pdo

我似乎无法从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 $

如何获取错误信息?

4 个答案:

答案 0 :(得分:64)

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

对于模拟的预准备陈述,prepare()

中没有签入
  

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

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

然而,mySQL驱动程序支持自mySQL 4.1以来的本机预处理语句,所以这不适用。使用

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

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

答案 1 :(得分:4)

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

语句级别获取信息

每个PHP网站:

  

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

答案 2 :(得分: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;

答案 3 :(得分:2)

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

 $sth->execute();

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