Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为PDO使用try catch块_Php_Mysql_Pdo_Try Catch - Fatal编程技术网

Php 如何为PDO使用try catch块

Php 如何为PDO使用try catch块,php,mysql,pdo,try-catch,Php,Mysql,Pdo,Try Catch,当使用try-catch块时,处理PDO错误的合适方法是什么 目前我有这样的想法: <?php class Blog extends Controller { public function comments() { $data = array(); $model = new BlogModel; if ($model->save(2,'test')) { $data['result'

当使用try-catch块时,处理PDO错误的合适方法是什么

目前我有这样的想法:

<?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();
    }
}
?>
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;
       }
   }
因此,在controllerBlogController.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-block的合适方法是什么?我不想一直对变量进行编码(
$data['result']['message']
$data['result']['status']

是否可以在catch块中添加“throw exception”

如果控制器中有很多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


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

这里的答案都没有错。但实际上,这三者结合起来才是真正的答案。 你一定要定下来

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
正如Cerad所说的那样

从现在起,任何关于数据库的问题都会通过类型为
PDOException
的异常抛出。你不必像激光雷达所说的那样抛出你自己的
异常
,因为它没用。只需将激光雷达代码转换为

 ...
 $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脚本,您可以再次找到它


将这些东西结合起来,您将有一种灵活、干净、简单的调试方法来捕获所有可能出现的错误。

只是好奇:这是CakePHP吗?我说不出来。@SimpleCoder我自己写的MVC;)哦,太好了。我想直接使用PDO应该已经放弃了这一点,而不是Cake的db接口。你可以删掉所有无用的html,但你得到了要点…+1,因为它实际上展示了一个示例,而不仅仅是提供了指向其他内容的链接。这不是一个糟糕的示例,谢谢。。有别的办法吗?一般的要求。您知道如何告诉PDO抛出异常而不是生成错误吗?基本上使用我在回答中显示的setAttribute方法。您是否了解,一旦PDO抛出异常,就不再需要检查诸如:$stmt->execute()之类的错误;