2

要求に応じて、質問を再フォーマットします。

次のコードの場合:

$newPDO=new PDO($DSN,$USER,$PASS);
$newPDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$SQL='SOME SQL STATEMENT MAYBE FAULTY';
try{
$Query=$newPDO->Prepare($SQL)
$Success=$Query->execute();
if(!$Success)
  echo('A');
}
catch(PDOException $e)
{
  echo('B');
}

質問は、「A」が印刷されているのを見ることは可能ですか? $SQL 選択や挿入などのタイプによって答えは異なりますか?

元の質問:

  • まず、属性を PDO::ATTR_ERRMODE、PDO::ERRMODE_EXCEPTION に設定して、execute() が DB からのエラーに遭遇したときに例外をスローするようにします。次に、それが本当なら、スローされた例外が返された「false」と同じである限り、execute() の戻り値をチェックする必要さえないかもしれないことに気付きました。外から捕まえるしかない。何もキャッチされない場合、クエリは問題ありません。
    しかし、マニュアルによると、デフォルトでは execute() は例外をスローしないため、これについてはわかりません。何かを挿入すると、PKの重複や一意の制約違反など、いくつかの操作を試しました。私のアサーションはサポートされています。PDO は例外をスローし、DB から詳細エラー メッセージを取得できます。しかし、これが普遍的な真実かどうかはわかりません. ERRMODE を最大に設定したときに、execute() から false を取得し、PDOEXCEPTION をスローしないことは可能ですか? *
4

2 に答える 2

0

これを試して:

   try {
      //Initial query processing
      $execute = $query->execute()
      if (!$execute) {
        //catch the exception
        throw new Exception ("blah")
      }
    } catch (Exception $e) {
      //Exception logic here

    }

このようにクエリを記述し、tryセクションで例外が発生した場合、それはセクションに中継され、catch好きなように処理できます (id が特定のケースに依存するかどうかにかかわらず)。

例外がない場合、catchステートメントに到達することはなく、クエリは実行されます。

DUPLICATESに関しては、SQL でこれを回避する必要があります。たとえば、クエリは次のようになります。

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 
于 2012-07-23T17:19:17.353 に答える