PHP & mySQL: codice semplice per implementare Transaction – Commit & Rollback

LA MIA PIATTAFORMA:

PHP e MySQL

LA MIA SITUAZIONE:

Sto cercando di implementare le transactions all'interno del mio codice. Ho provato a seguire degli esempi, ma non è di grande aiuto. Sono in esecuzione 3 query e volevo scrivere una transazione in modo tale che se una qualsiasi delle query fallisse, l'intera transazione dovrebbe tornare indietro. Gradirei davvero un codice PHP semplice, efficiente e non orientato agli oggetti per raggiungere questo objective. Grazie in anticipo.

IL MIO CODICE PHP:

//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? } 

È necessario utilizzare l' estensione mysqli per utilizzare questa funzionalità.

Vedi: autocommit () , commit () e 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); ?> 

Non hai bisogno di usare mysqli. Puoi semplicemente emettere i comandi di transazione come query.

Quindi per il tuo esempio:

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

A proposito, se stai pensando di aggiornare a mysqli, per favore non farlo. Passa invece al PDO, è molto più sano.