2010-01-25 5 views
5

MY PLATFORM:PHP & MySQL: Einfacher Transaktionscode zu implementieren - Commit & Transfer abbrechen

PHP & mySQL

Meine Situation:

Ich versuche, Transaktionen in meinem Code zu implementieren . Ich habe versucht, Beispielen zu folgen, aber es hilft nicht viel. Ich führe 3 Abfragen aus und ich wollte eine Transaktion so schreiben, dass wenn die Abfrage (n) fehlschlagen, die gesamte Transaktion zurückgesetzt werden sollte. Ich würde wirklich einen einfachen, effizienten und nicht objektorientierten PHP-Code schätzen, um dieses Ziel zu erreichen. Vielen Dank im Voraus.

MY PHP CODE:

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
//commit --- but how? 
} 
else 
{ 
//rollback --- but how? 
} 
+1

eine einfache und ausgezeichnete Antwort/Beispiel (Versuch fangen) wurde die gleiche Frage an http://StackOverflow.com/Questions/2708237/php-mysql-transactions-examples muss gelesen werden, zeigt GENAU, was zu tun ist klar und einfache Begriffe. –

+0

Überprüfen Sie diese http://dev.mysql.com/doc/refman/5.0/en/commit.html. Dies sollte Sie in die richtige Richtung lenken. –

Antwort

6

Sie müssen die mysqli extension verwenden, um diese Funktion zu nutzen.

Siehe auch: autocommit(), commit() und rollback()

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 

/* delete all rows */ 
mysqli_query($link, "DELETE FROM myCity"); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity.\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Rollback */ 
mysqli_rollback($link); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity (after rollback).\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Drop table myCity */ 
mysqli_query($link, "DROP TABLE myCity"); 

mysqli_close($link); 
?> 
+0

@John Vielen Dank für Ihre Antwort. Ich habe mehr als 85% meiner Anwendung mit mysql_query erstellt. Ich denke, dass ich meine Anwendung ändern und von Grund auf neu bearbeiten muss, wenn ich mysqli verwenden muss. Ist es in irgendeiner Weise möglich, dies mit mysql_query zu tun? Ich bin mir nicht sicher, ob ich zu diesem Zeitpunkt zu mysqli wechseln kann, daher wird eine alternative Lösung sehr geschätzt. Freue mich auf deine Antwort. – Devner

+2

Leider nicht. Die mysql_ * -Funktionen bieten keinen Zugriff auf die erweiterten Funktionen von MySQL 4 und höher wie Transaktionen und gespeicherte Prozeduren. Sie müssen nicht zurückgehen und jeden Aufruf von MySQL ändern, um mysqli zu verwenden. Ändern Sie einfach die Seiten, die sie tatsächlich benötigen. –

+0

Ich werde das versuchen. Vielen Dank. – Devner

13

Sie brauchen nicht mysqli zu verwenden. Sie können die Transaktionsbefehle nur als Abfragen ausgeben.

So für Ihr Beispiel:

mysql_query("start transaction;"); 

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
    mysql_query("commit;"); 
} 
else 
{ 
    mysql_query("rollback;"); 
} 

Durch sie Art und Weise, wenn Sie über ein Upgrade nachdenken mysqli, bitte nicht. Aktualisieren Sie stattdessen auf PDO, es ist viel vernünftiger.

+0

Ich denke du meinst mysql_query ("start transaction"); oder mysql_query ("begin"); – Rooster242

+0

Ja, hat sich zwischen den beiden vermischt ... Wird repariert. – rjmunro

+0

mysql ist nicht sicher, versuchen Sie mit mysqli oder PDO – Asuquo12