簡體   English   中英

如何使用try-catch塊進行PDO

[英]How to use try-catch block for PDO

使用try catch塊時,處理PDO錯誤的好方法是什么?

目前我有這樣的事情:

BlogModel.php

   class BlogModel extends Model {
       public function save($id, $value) {
         $stmt = $this->getDb()->prepare('UPDATE setting SET name = :name WHERE id = :id');
         $stmt->bindParam(':id', $id);
         $stmt->bindParam(':name', $values);
         return ($stmt->execute() !== false) ? $id : false;
       }
   }

所以,在控制器BlogController.php中 ,我會做這樣的事情:

<?php
class Blog extends Controller {

    public function comments()
    {
        $data = array();
        $model = new BlogModel;

        if ($model->save(2,'test')) {
                $data['result']['message'] = 'Settings saved';
                $data['result']['status'] = 'success';
        } else {
                $data['result']['message'] = 'Could not save the settings';
                $data['result']['status'] = 'error';
        }

        $view = new View("view.php", $data)
        $view->render();
    }
}
?>

這是我使用if條件處理PDO錯誤的方法。 將此轉換為try catch塊的正確方法是什么? 我不想一直編碼變量( $data['result']['message'] $data['result']['status'] )。

有可能以某種方式在catch塊中添加“拋出異常”嗎?

如果控制器中有很多try catch塊,它看起來會很亂......對嗎?

關於什么:

class BlogModel extends Model {
   public function save($id, $value) {
   ...
   if (!$stmt->execute()) {
        throw new Exception($stmt->errorInfo());
    }
   return $id;

接着

 ...
 $data = array();
 $model = new BlogModel;

    try{
      $model->save(2,'test');
      $data['result']['message'] = 'Settings saved';
      $data['result']['status'] = 'success';
    }catch(Exception $e){
        $data['result']['message'] = 'Could not save the settings';
        $data['result']['status'] = 'error';
    }

您是否考慮讓PDO自己拋出異常而不是錯誤?

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

現在您可以消除檢查PDO錯誤,這可以顯着減少代碼。 您可以添加一些try / catch塊來捕獲可以從諸如約束違規中恢復的異常。

對於其他人,只需在前端控制器的高處使用Try / Catch來捕獲真正的例外情況。

我的方法的唯一區別是在BlogModel中你只是:

$stmt->execute();

沒有檢查或其他任何東西。 如果插入失敗,只需讓PDO拋出異常。 然后你將使用你的控制器中的try / catch, 如ladar所示

或者在我的情況下,如果我非常確定插入永遠不會失敗,那么我只需在我的前端控制器中使用通用的try / catch塊,而不是花時間嘗試手動處理每個可能的異常。

這里的答案都沒有錯。 但實際上所有三個組合都是真正的答案。 你一定要設置

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

正如塞拉德所說

從現在開始,關於數據庫的任何問題都會通過PDOException類型的異常拋出。 你不必像Ladar所說的那樣拋出你自己的Exception ,因為它沒用。 只需拿出ladar代碼並將其轉換為

 ...
 $data = array();
 $model = new BlogModel;

    try{
      $model->save(2,'test');
      $data['result']['message'] = 'Settings saved';
      $data['result']['status'] = 'success';
    }catch(PDOException $e){
        $data['result']['message'] = 'Could not save the settings';
        $data['result']['status'] = 'error';
    }

不要自己扔任何東西。

然后,調試PDO查詢的一種非常好的方法是使用Basic鏈接的catch腳本,您可以在此處再次找到它。

結合這些東西,你將有一個靈活,干凈,易於調試的方式來捕捉可能出現的所有錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM