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

はい、あります。いいえ、やるべきではありません。

あなたがすべきことは、関数内でそれをキャッチするのではなく、代わりにメソッド呼び出しをより高いレベルの内部でキャッチ ブロックでラップすることです。すなわち:

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 に答える