提问人:Your Common Sense 提问时间:9/16/2010 最后编辑:Peter MortensenYour Common Sense 更新时间:12/23/2016 访问量:33193
如何从PDO中挤出错误消息?[复制]
How to squeeze error message out of PDO? [duplicate]
问:
我似乎无法从 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 $
如何获取错误信息?
答:
您需要先进行查询,然后检查错误: 所以这样做是这样的:execute
$sth->execute();
,然后检查错误。然后你会得到错误,如果有的话。
评论
setAttribute 将导致 PDO 抛出错误或异常 - 最晚的在执行查询时。
对于模拟的预准备语句,没有签入:prepare()
模拟预准备语句不与数据库服务器通信,因此 PDO::p repare() 不会检查该语句。
但是当查询发送到服务器时,会有一个。execute()
但是,mySQL 驱动程序自 mySQL 4.1 以来都支持本机预准备语句,因此这不应该适用。用
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
必须对您使用的查询造成异常。
评论
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
ERRMODE_EXCEPTION
prepare()
exec()
我也试图从数据库句柄级别获取信息,但最终我从语句级别获取了信息errorInfo()
PDOStatement::errorInfo()
每个PHP网站:
PDO::errorInfo() 仅检索直接在数据库句柄上执行的操作的错误信息。如果通过 PDO::p repare() 或 PDO::query() 创建 PDOStatement 对象并在语句句柄上调用错误,则 PDO::errorInfo() 不会反映语句句柄中的错误。必须调用 PDOStatement::errorInfo() 以返回对特定语句句柄执行的操作的错误信息。
这将打印错误代码及其相应的详细消息。
建议:这只是一个演示。仅用于调试目的。不要启用以在发布版本中向公众显示错误消息。
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;
评论
:-)
评论
print_r($sth->errorInfo())