2012-03-24 15 views
0

Ich habe ein seltsames Problem, das ich nicht verstehe. Ich habe die folgende Funktion, die $ ASSET_ID zurückkehren soll:PDO Transaktion Rollback bei der Rückgabe von LastInsertID

function commit_purchase($asset_type_ID, $org_ID, $asset_desc, $asset_cost, $date, $org_to_member_ID, $asset_ID, $purchaser_cur_invest, $purchaser_cred_deb, $purchaser_balance) { 
global $db; 
$db->beginTransaction(); 
$query = "INSERT INTO assets 
         (asset_type_ID, org_ID, asset_desc, asset_cost, asset_value, purchase_date, is_approved) 
        VALUES 
         (:asset_type_ID, :org_ID, :asset_desc, :asset_cost, :asset_cost, :date, 1)"; 
$statement = $db->prepare($query); 
$statement->bindValue(':asset_type_ID', $asset_type_ID); 
$statement->bindValue(':org_ID', $org_ID); 
$statement->bindValue(':asset_desc', $asset_desc); 
$statement->bindValue(':asset_cost', $asset_cost); 
$statement->bindValue(':date', $date); 
$statement->execute(); 
$asset_ID = $db->lastInsertId(); 
//return $asset_ID; 
$db->commit(); 
} 

ich die Funktion nenne etwa so:

$asset_ID = commit_purchase($asset_type_ID, $org_ID..etc, etc.); 

Wenn ich die return $asset_ID Kommentar-, rollt die Transaktion zurück und verpflichten sich nicht. Wenn ich es kommentiert lasse, wird die Variable nicht übergeben. Wenn ich die beginTransaction und commit Zeilen kommentieren, kann ich die Rückkehr $asset_ID auskommentieren und alles funktioniert.

Ich möchte es als eine Transaktion bleiben und ich möchte die $asset_ID zurückgeben. Was mache ich falsch?

Antwort

1

Sie müssen die Zeile return $asset_ID; nach dem Festschreiben verschieben, da die Ausführung der Funktion beendet wird, wenn Sie return. Ohne dass das Commit aufgerufen wird, erhalten Sie ein implizites Rollback.

+0

Das hat den Trick gemacht. Ich plane, noch ein paar Fragen vor dem Commit einzureichen. Kann ich die Variable $ asset_ID in den folgenden Abfragen verwenden? – Progger

+0

Ja. Sobald Sie die Variable zugewiesen haben, kann sie innerhalb des aktuellen Bereichs verwendet werden, sofern Sie sie nicht überschreiben oder aufheben. Sie dürfen den Wert erst zurückgeben, nachdem Sie alle Ihre Abfragen ausgeführt und sie übernommen haben. – nnichols