2012-02-12 45 views
2

使用try catch塊時,處理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 condit處理PDO錯誤的方式離子。將此轉換爲try catch塊的體面方式是什麼?我不想一直編碼變量($data['result']['message']$data['result']['status'])。

是否可能以某種方式在catch塊中添加「throw exception」?

如果在控制器中有很多try catch塊,它會顯得雜亂......對吧?

+0

只是好奇:這是CakePHP?我不知道。 – 2012-02-12 20:14:15

+1

@SimpleCoder我自己的MVC我寫過;) – 2012-02-12 20:14:48

+0

哦,整潔。我猜PDO的直接使用應該已經給出了,而不是Cake的db接口。 – 2012-02-12 20:16:58

回答

3

這裏沒有任何答案是錯誤的。但實際上所有三個組合都是真正的答案。 由CERAD說你一定要設置

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

從現在開始,任何事情對於數據庫中的每個單一的問題通過PDOException類型的異常。你只是不必像ladar所說的那樣扔自己的Exception,因爲它沒用。只取激光雷達代碼,並將其轉換成

... 
$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查詢一個非常好的方法是使用由基本聯動抓腳本,您可以再次找到here

將這些事情結合起來,您將擁有靈活,乾淨和簡單的調試方式來捕捉所有可能發生的錯誤。

3

什麼:

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'; 
    } 
+0

實際上顯示一個例子,而不只是提供一個鏈接到其他 – cspray 2012-02-12 21:39:58

+0

不是一個壞例子,謝謝..有沒有其他的方法呢? – 2012-02-12 21:48:34

3

你有沒有考慮讓PDO本身拋出異常,而不是錯誤?

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

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

其餘的只需在你的前端控制器的某個地方使用Try/Catch來捕捉真正的例外情況。

在我的方法,唯一不同的是,在BlogModel你剛纔:

$stmt->execute(); 

不檢查或其他任何東西。只要插入失敗,讓PDO拋出一個異常。然後你會使用你的控制器中的try/catch as shown by ladar

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

+0

一般要求的種類。你知道如何告訴PDO拋出異常而不是產生錯誤嗎?基本上使用我在答案中顯示的setAttribute方法。你是否明白,一旦PDO拋出異常,就不再需要檢查類似這樣的錯誤了:$ stmt-> execute(); – Cerad 2012-02-13 01:03:45