2016-07-14 11 views
0

Hier haben ist meine Skript Struktur:Transaktionen für Abfragen verwenden, die abhängigen Ergebnisse

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; 
} 

Das Ergebnis meines Code immer ist second problem. Warum? Und wie kann ich meinen Code umschreiben, um ihn zu reparieren?

Bitte beachte, dass ich diesen Zustand getestet habe if($num_rows) { separat (in einem anderen Skript einzeln) und es ist wahr, aber wenn ich es in Skript oben schreiben, es ist immer falsch .

+0

'fetch()' gibt FALSE zurück, wenn Fehler auftreten. Sind Sie sicher, dass diese Abfragen keinen solchen Fehler erzeugen? Es gibt auch NULL zurück, wenn keine weiteren Datensätze mehr abgerufen werden sollen. Sind Sie sicher, dass die Abfrage tatsächlich Ergebnisse liefert, wenn die Eingabe erfolgt? Sie können versuchen, Protokoll zu untersuchen. –

Antwort

0

Der Zweck von Transaktionen besteht darin, sicherzustellen, dass Abfragen, die zusammen auftreten müssen, niemals aufgelöst werden. In Ihrem Anwendungsfall kann die erste Abfrage isoliert ohne Nachteile ausgeführt werden.

Setzen Sie die letzten beiden in eine Transaktion, aber lassen Sie die erste in Ruhe. Wenn der erste fehlschlägt, führe einfach nicht die anderen zwei aus.

Wenn der erste erfolgreich ist, aber einer der beiden anderen (in der Transaktion) fehlschlägt, so dass keiner der beiden festgeschrieben ist, sind Sie nicht schlechter dran, wenn Sie den ersten ausgeführt haben.

+0

emm, ehrlich gesagt kann ich mir nicht vorstellen was du gesagt hast .. kannst du bitte den code in deine antwort einfügen? –

+0

Es gibt keinen Code, es ist Logik; Ich habe die Antwort ein wenig aktualisiert. Wenn es noch unklar ist, sag mir bitte, worüber du besorgt bist (zB warum benutzt du eine Transaktion) und ich werde meine Antwort umschreiben, um zu zeigen, wie ich das anspreche. – BeetleJuice

+0

@MartinAJ Ich dachte, du hättest diese Antwort aufgegeben, weil du nicht geantwortet hast. Entschuldigung, wenn es verwirrend war; Ich hoffe, es hat irgendwann Sinn ergeben – BeetleJuice