如何从PDO中挤出错误消息?[复制]

How to squeeze error message out of PDO? [duplicate]

提问人:Your Common Sense 提问时间:9/16/2010 最后编辑:Peter MortensenYour Common Sense 更新时间:12/23/2016 访问量:33193

问:

我似乎无法从 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 处理程序
PDO 驱动程序 for MySQL 启用
的客户端 API 版本 mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $

如何获取错误信息?

PHP 错误处理 PDO

评论

0赞 shamittomar 9/16/2010
打印出来是什么?print_r($sth->errorInfo())
0赞 Your Common Sense 9/16/2010
@shamittomar我也尝试过,它给出了一个包含 3 个空元素的数组

答:

3赞 shamittomar 9/16/2010 #1

您需要先进行查询,然后检查错误: 所以这样做是这样的:execute

 $sth->execute();

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

评论

0赞 Mawg says reinstate Monica 10/26/2016
毕竟,这就是问题所在。为什么这是作为答案发布的,而不是评论?为什么它能获得如此多的赞成票?
66赞 Pekka 9/16/2010 #2

setAttribute 将导致 PDO 抛出错误或异常 - 最晚的在执行查询时。

对于模拟的预准备语句,没有签入:prepare()

模拟预准备语句不与数据库服务器通信,因此 PDO::p repare() 不会检查该语句。

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

但是,mySQL 驱动程序自 mySQL 4.1 以来都支持本机预准备语句,因此这不应该适用。用

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

必须对您使用的查询造成异常。

评论

0赞 Your Common Sense 9/16/2010
手册页示例也不执行:ru2.php.net/manual/en/pdo.errorinfo.php 和 execute 仍然没有运气
2赞 Pekka 9/16/2010
@Col如果你设置了怎么办?$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
0赞 Pekka 9/16/2010
@Col 如果您设置并且没有例外,那么其他东西就错了 - 在这种情况下,我不知道是什么ERRMODE_EXCEPTIONprepare()exec()
0赞 Your Common Sense 9/16/2010
这个奏效了。请将其添加到答案中,这样我就可以接受它。虽然它仍然让我感到困惑,为什么 errorInfo() 不起作用
1赞 Chris Baker 4/11/2013
默认情况下,模拟的准备语句似乎为 Mysql PDO 打开。出于某种原因。您必须显式关闭仿真。
5赞 BitsAndBytes 8/25/2012 #3

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

每个PHP网站:

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

4赞 aimme 8/18/2015 #4

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

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

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;

评论

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