如何使用try-catch块进行PDO

时间:2012-02-12 20:13:15

标签: php mysql pdo try-catch

使用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块,它看起来会很乱......对吗?

3 个答案:

答案 0 :(得分: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';
    }

答案 1 :(得分:3)

您是否考虑让PDO自己抛出异常而不是错误?

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

现在您可以消除检查可以显着减少代码的PDO错误。您可以添加一些try / catch块来捕获可以从诸如约束违规中恢复的异常。

对于其他人来说,只需在前端控制器的高处使用Try / Catch来捕捉真正特殊的异常。

我的方法的唯一区别是在BlogModel中你只是:

$stmt->execute();

不检查或其他任何事情。如果插入失败,只需让PDO抛出异常。然后,您将在控制器as shown by ladar

中使用try / catch

或者在我的情况下,如果我非常确定插入永远不会失败,那么我只需在我的前端控制器中使用通用的try / catch块,而不是花时间尝试手动处理每个可能的异常。

答案 2 :(得分:3)

这里的答案都没有错。但实际上所有三个组合都是真正的答案。 你一定要设置

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

Cerad 所述。

从现在开始,关于数据库的任何问题都会通过类型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查询的一个非常好的方法是使用由基本链接的catch脚本,您可以再次找到here

将这些事情结合起来,您将拥有一种灵活,简洁,易于调试的方式来捕捉可能出现的所有错误。