2012-02-12 83 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