2012-04-12 145 views
1

我目前已切換到使用PDO,但在處理異常時遇到問題。連接是正確的,查詢工作完美,但是當我犯了故意的錯誤時,錯誤不會按我的預期處理。PDO PHP未捕獲異常

我已將我的查詢中表的名稱更改爲不存在的表。從下面看到的代碼,我希望頁面打印出'數據庫錯誤',但相反得到可怕的橙色錯誤說...

'帶有消息'SQLSTATE [42S02]的未捕獲異常'PDOException':基表或查看未找到:1146第46行'C:\ wamp \ www \ website \ functions.php中不存在表'test.post''

這是連接數據庫時的代碼...

$hostname = 'localhost'; 
$username = ''; 
$password = ''; 
try{ 
    $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    print ("Database Error"); 
} 

我犯了一個錯誤還是有不同的方式來處理PDO錯誤?

+0

如果您只是嘗試捕獲常規的'Exception'而不是'PDOException',會發生什麼? – Crontab 2012-04-12 13:53:47

+0

查詢在哪裏?這就是例外的地方,而不是連接點。 – Paystey 2012-04-12 13:55:44

+0

你在名字空間工作嗎?常見的錯誤是你需要趕上'\ YourException'! – Nanne 2012-04-12 13:55:58

回答

5

連接後,您需要設置錯誤處理:

$dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

編輯:注意,除了被它拋出的地方捕獲,所以你需要把trycatch塊周圍的查詢,連接時使用的查詢只捕獲異常(如果有的話,請參閱@Crontab的註釋)。

+0

除了在創建對象時發生錯誤*因此在事實之後設置屬性不會有所幫助。 – Crontab 2012-04-12 13:56:33

+0

我修改了代碼,但是仍然存在相同的錯誤 – Phil 2012-04-12 13:57:30

+0

@Crontab這當然是事實,但這並不真正適用於OP在談論查詢的情況。 – jeroen 2012-04-12 13:58:15