2016-07-14 2 views
0

を持つクエリのトランザクションを使用すると、私のスクリプトの構造である:私のコードここに依存した結果

try { 
    $dbh_conn->beginTransaction(); 

    $stmt1 = $dbh_conn->prepare("SELECT user_id FROM activate_account WHERE token = ?"); 
    $stmt1->execute(array($validate_activate_token)); 
    $num_rows = $stmt1->fetch(PDO::FETCH_ASSOC); 

    if($num_rows) { 

     $user_id = $num_rows['user_id']; 

     $stmt2 = $dbh_conn->prepare("UPDATE users SET active = 1 WHERE id = ?"); 
     $stmt2->execute(array($user_id)); 
     $updated = $stmt2->rowCount(); 

     if ($updated > 0){ 

      $stmt3 = $dbh_conn->prepare("DELETE FROM activate_account WHERE token = ?"); 
      $stmt3->execute(array($validate_activate_token)); 

      $status = "all fine"; 

     } else { 

      $status = "first problem"; 
     } 

    } else { 

     $status = "second problem"; 
    } 

    $dbh_conn->commit(); 
    echo $status; 
    die; 

} catch(PDOException $e) { 

    $dbh_conn->rollBack(); 

    $status = "third problem"; 
    echo $status; 
    die; 
} 

結果は常にsecond problemです。どうして?そして、それを修正するためにコードを書き直すにはどうすればよいですか?私は(単独で別のスクリプトでは)別にこの条件if($num_rows) {をテストしてみた

、それはですが、私は上記のスクリプトにそれを書くとき、それは常にです。

+0

'fetch()'はエラーがあればFALSEを返します。これらのクエリでこのようなエラーが発生しないことは確かですか?フェッチするレコードがもうない場合はNULLを返します。あなたは本当に質問が入力を与えられた結果を返すと確信していますか?ログの調査を試みることができます。 –

答えて

0

トランザクションの目的は、一緒に実行する必要があるクエリが決して分割されないようにすることです。あなたのユースケースでは、最初のクエリは、邪魔をしないで孤立して実行できます。

最後の2つをトランザクションに入れますが、最初の2つはトランザクションのままにしておきます。最初に失敗した場合は、他の2つを実行しないでください。

最初に成功したにもかかわらず、トランザクション内の他の2つのいずれかが失敗して、どちらもコミットされていない場合、最初のものを実行したことで悪化することはありません。

+0

emm、正直言って、あなたが言ったことを想像することはできません。答えにコードを追加してもらえますか? –

+0

ロジックがないというコードはありません。私は少し答えを更新しました。それでも不明な点がある場合は、どうしてあなたが何が起こるのか(つまり、なぜトランザクションを使用しているのか)教えてください。私はこれに対処する方法を示すために回答を書き直します。 – BeetleJuice

+0

@MartinAJあなたが答えなかったので、あなたはこの答えをあきらめてしまったと思いました。それが混乱していたらごめんなさい。それは最終的に意味を願って – BeetleJuice

関連する問題