[PHP][PDO] pdo errorinfo無錯誤回應的解決辨法

筆者在使用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) {
      /*
      *  請輸入失敗後要處理的程式碼
      */

}



沒有留言:

不再限制您的多媒體創作:使用NDI快速傳輸、處理和編輯高品質的視訊和音訊。

NDI(Network Device Interface)是一種基於IP網絡的視訊和音訊傳輸協議,它可以讓您在同一網絡上的不同設備之間傳輸高品質的視訊和音訊。使用NDI,您可以將視訊和音訊直接傳輸到其他設備上,而不需要使用任何額外的硬體。 以下是使用NDI的步驟: 下載並安裝ND...