2012-01-08 70 views
49
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中的查詢錯誤PHP

回答

11

我猜你的抱怨是這個例外沒有解僱。 PDO最有可能配置爲不拋出異常。這個讓他們:

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

不能繼續工作,我知道我的查詢是錯誤的,但我想顯示該錯誤。 – TPSstar 2012-01-08 08:48:12

+0

您可能會發現調用'new PDO(...'本身時出錯,嘗試通過設置例如'error_reporting(E_ALL)'來提高error_reporting的級別。 – 2012-01-08 08:49:40

22

我使用這個無需任何額外的設置:

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

您需要設置錯誤模式屬性PDO :: ATTR_ERRMODE以PDO :: ERRMODE_EXCEPTION。
而且由於您期望prepare()方法拋出異常,因此應該禁用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 =真似乎是爲PDO_MYSQL驅動程序的默認設置現在。 查詢緩存的東西已經修復/從那時起,並與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 
)); 
6

一個快速的方法來看看你的錯誤?同時測試:

+0

我認爲這很簡單 – NaveenDA 2016-12-27 17:16:47

-1

這個工作對我來說如果你得到這個錯誤:

致命錯誤:調用未定義的方法的mysqli ::錯誤()

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

https://stackoverflow.com/a/32045823

+0

爲什麼downvote,我的代碼有問題嗎? – 2017-12-20 10:56:55

1

/*惹的錯誤 - 骨頭表不存在*/

$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 
)