2016-05-16 7 views
-1

はここに私のスクリプトです:すべてのPDOトランザクションにtry catch例外を使用できますか?

$id = $_GET['id']; 
$value = $_GET['val']; 

// database connection here 

try{ 
    $db_conn->beginTransaction();        // this 

    $stm1 = $db_conn->prepare("UPDATE table1 SET col = "updated" WHERE id = ?"); 
    $stm1->execute(array($value)); 
    $done = $stm->rowCount(); 

    if ($done){ 
     try { 
      $stm2 = $db_conn->prepare("INSERT into table2 (col) VALUES (?)"); 
      $stm2->execute(array($id)); 

     } catch(PDOException $e){ 
      if ((int) $e->getCode() === 23000) { // row is duplicate 
       $stm3 = $db_conn->prepare("DELETE FROM table2 WHERE col = ?"); 
       $stm3->execute(array($id)); 
      } 
     } 

    } else { 
     $error = true; 
    } 

    $db_conn->commit();           // this 
} 
catch(PDOException $e){ 
    $db_conn->rollBack(); 
} 

まず、私が言っている、私のスクリプトが動作します。私はその結果を意味するか、それはテストで期待通りです。ただ一つのことが私を怖がらせる。

ネストされたcommit()を使用してトランザクションを早く終了する可能性があるため、動作しない可能性があり危険です。

私はちょうど私が私がbeginTransaction()commit()の間でネストされたtry - catchを使用してはならない多分理解し、上記の文の意味が何かわかりません。まあ、私はそれが正しい?それは危険ですか?

+0

ドキュメントにはどこですか? – Phil

+5

トランザクションを使用している場合、エラー時にレコードを削除する必要はありません。ロールバックするだけです。文はtry/catchについてではなく、 'beginTransaction()'/'commit()'のネストに関するものです。 .. – n00dl3

+0

@Phil http://php.net/manual/en/pdo.begintransaction.php – stack

答えて

2

例外はトランザクションとは直接関係しません。必要に応じて、コード内に多くのcatchブロックを追加できます。

PDOエラー報告を例外に設定しているので、コードは問題ありません。

+0

あなたの答えは1行で、私が聞いていただけです!私はなぜこれまで誰も言わなかったのか分からない。ありがとう.. upvote – stack

+0

ちょうど1つの事、私は英語をとてもよく知らない。私にこの文を言い換えてください。 * "既にPDOエラー報告を例外に設定している場合、" * – stack

+1

PDO :: ATTR_ERRMODEをPDO :: ERRMODE_EXCEPTIONに設定していればコードはOKです –

関連する問題