3

目前,当我的 SQL 出现错误时,它会引发如下所示的传统错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax...|

我知道我可以通过将每个 SQL 例程包装在 try/catch 块中来实现我想要的,但这似乎有点冗长:

class ProductsModel extends Model {

  function __construct()
  {
    parent::__construct();
  }

 public function setName($name, $productId)
  {
    $SQL = 'UPDATE products SET name = ? WHERE id = ?';
    try{
    $r = $this->db->prepare($SQL);
    $r->execute(array($name, $productId));
    }catch(PDOException $e) {
      echo 'Error!';
    }
  }
}

有没有办法让所有 SQL 查询自动完成?

4

3 回答 3

8

是的,有,不,你不应该这样做。

应该做的不是在函数内部捕获它,而是使用 catch 块将方法调用包装在更高级别的内部。IE:

try {
    $productsModel->setName("name", 42);
}
catch (PDOException $e) {
    //Do something, 500 error code, whatever
}

那是因为,只有当您尝试访问数据库时,您才知道在失败时您要做什么

这个:

  • 使您的方法更干净,方法内部不需要错误处理。
  • 给你灵活性。在某些时候,如果失败,您可能希望抛出 500 错误,而在另一个时候,您可能希望将 JSON 对象返回给 AJAX 调用。
于 2013-11-06T20:11:11.257 回答
4

您可以设置异常处理程序

<?php
function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>

它将捕获所有异常类型,而不仅仅是 PDOExceptions。如果你想专门处理所有 PDOExceptions,你可以像这样检查:

function exception_handler($exception) {
   if ($exception instanceof PDOException) {
       echo 'This is a PDOException';
   }
}
于 2013-11-06T20:09:20.510 回答
-1

实现自己的类 PDO 类:

class MYPDO extends PDO {
  public function query() {
    try {
      call_user_func_array(array($this, 'parent::query'), func_get_args());
    }catch(PDOException $e) {
      echo 'Error!';
    }
  }
}

$db = new MYPDO(...);
$db->query(...);
于 2013-11-06T20:17:19.090 回答