2012-11-07 99 views
0

我有這個問題,讓我發瘋。我想要的只是檢查一個錯誤的查詢,如果是的話顯示錯誤,否則運行查詢。PHP PDO檢查mysql錯誤

我有以下的幾乎是(因爲它運行插入查詢兩次)工作

[..] 

$dbdata = new mySQLAccessData(); 
$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$defaults = new Defaults(); 

[..] 

if(!$db->exec($sql)){ 
    echo($defaults->throwError('MySql error',implode(":",$db->errorInfo()))); 
}else{ 
    $db->exec($sql); 
    $defaults->writeLog($table,$db->lastInsertId(),'add'); 
} 

我試過無數的事情(還有其他的方法try(){}catch(){}),但不只是上面的代碼工作。它顯示我想要的方式的錯誤,並且只有當發生錯誤時,但運行兩次exec() ...

有人可以幫我解決嗎?

+0

在這裏閱讀http://php.net/manual/en/class.pdoexception.php –

+0

爲什麼不把'$ db-> exec($ sql)'的結果賦值給一個變量。 '$ result = $ db-> exec($ sql);'。然後在'if($ result)'中使用'$ result'的值。 –

回答

0

爲什麼要在else部件中再次執行查詢?通常你只是試着運行查詢,如果發生錯誤,就對它們做出反應。

[..] 

$dbdata = new mySQLAccessData(); 
$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$defaults = new Defaults(); 

[..] 

if(!$db->exec($sql)){ 
    echo($defaults->throwError('MySql error',implode(":",$db->errorInfo()))); 
}else{ 
    $defaults->writeLog($table,$db->lastInsertId(),'add'); 
} 

據我所知,在實際執行之前沒有選擇「測試」查詢。

+0

啊,不知道查詢會在if()部分裏面運行。謝謝你的提示! – Maurice

+0

@Maurice只要觸發'exec()'方法,查詢就會運行。無論你在哪種情況下做到這一點。 – Sirko

0

如果你想看到引發異常錯誤發生時,只是set the PDO error-mode(參見:Connections and Connection management):

$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

例如,這將自動使你的代碼拋出異常。可能正是你在找什麼。

您的代碼的實際問題是執行exec兩次。您不需要:

$success = $db->exec($sql); 

if (!$success) { 
    echo $defaults->throwError('MySql error', implode(":", $db->errorInfo())); 
} else { 
    # do not exec *again* here. 
    $defaults->writeLog($table, $db->lastInsertId(), 'add'); 
}