如何在PDO PHP中查看查询错误

try { $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW); $st = $db->prepare("SELECT * FROM c6ode"); } catch (PDOException $e){ echo $e->getMessage(); } 

在上述情况下,如何检查mysql错误的查询?

您需要将错误模式属性PDO :: ATTR_ERRMODE设置为PDO :: ERRMODE_EXCEPTION。
既然你期望prepare()方法抛出exception,你应该禁用PDO :: ATTR_EMULATE_PREPARES * 特性 。 否则,MySQL服务器在执行之前不会“看见”该语句。

 <?php try { $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)'); } catch(Exception $e) { echo 'Exception -> '; var_dump($e->getMessage()); } 

打印(在我的情况)

 Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.doesnotexist' doesn't exist" 

请参阅http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
EMULATE_PREPARES = true现在似乎是pdo_mysql驱动程序的默认设置。 查询caching的东西已经修复/改变从那时起,与mysqlnd驱动程序我没有EMULATE_PREPARES = false的问题(虽然我只是一个PHP的爱好者,不要把我的话…)

*),然后有PDO :: MYSQL_ATTR_DIRECT_QUERY – 我必须承认,我不明白这两个属性(还?)的交互,所以我把它们都设置

 $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array( PDO::ATTR_EMULATE_PREPARES=>false, PDO::MYSQL_ATTR_DIRECT_QUERY=>false, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION )); 

我使用这个没有任何额外的设置:

 if (!$st->execute()) { print_r($st->errorInfo()); } 

我猜你的抱怨是,例外是不是射击。 PDO最有可能被configuration为不抛出exception。 用这个来启用它们:

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

在testing时查看错误的快速方法:

 $error= $st->errorInfo(); echo $error[2]; 

/ *提出错误 – BONES表不存在* /

 $sth = $dbh->prepare('SELECT skull FROM bones'); $sth->execute(); echo "\nPDOStatement::errorInfo():\n"; $arr = $sth->errorInfo(); print_r($arr); 

产量

 Array ( [0] => 42S02 [1] => -204 [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704 ) 

这个工作对我来说,如果你得到这个错误:

致命错误:调用未定义的方法mysqli :: error()

 if(! empty( $db->error ) ){ echo $db->error; // <- this is not a function call error() } 

https://stackoverflow.com/a/32045823