筆者在使用pdo連接mariaDB或mysql的時後,
總是發現用execute,不管query什麼指令,就算有錯誤,
pdo的errorinfo總是回傳erorr code:00000,
最後的解決辨法,就是使用try~catch了,
首先在建立pdo物件之後
$pdo = new PDO($dsn, $this->db_user, $this->db_password);
要進行設定
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
接著在使用prepare與execute時,要加上try~catch
try {
$sth = $this->dbh->prepare($sql);
$queryresult = $sth->execute($value);
} catch (queryException $e) {
/*
* 請輸入失敗後要處理的程式碼
*/
}
這樣,就可以處理query失敗了。
若是用在Slim3,因為預設Exception都被Slim處理了,
最簡單的方法就是使用自訂Exception,
首先,pdo的設定要把
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);取消
或是改成預設
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
自己建立一個exception class
class queryException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' query err.';
return $errorMsg;
}
}
再建立一個執行throw的function
function err(){
throw new queryException('query Exception');
}
在execute後加上or(就是or die()的用法)
try {
$queryresult = $pdo->execute($value) or err();
if($queryresult){
/*
* 請輸入執行成功後要處理的程式碼
*/
}else{
/*
* 請輸入失敗後要處理的程式碼
*/
}
} catch (queryException $e) {
/*
* 請輸入失敗後要處理的程式碼
*/
}