2010-01-25 2 views
5

MY PLATEFORME:PHP et mySQL: Code simple à mettre en œuvre Transaction - Commit et Rollback

PHP & mySQL

MA SITUATION:

Je suis en train de mettre en œuvre des transactions dans mon code de . J'ai essayé de suivre des exemples, mais ça ne m'aide pas beaucoup. J'exécute 3 requêtes et je voulais écrire une transaction de telle sorte que si l'une des requêtes échoue, la transaction entière devrait revenir en arrière. J'apprécierais vraiment un simple, efficace et non orienté objet code PHP pour atteindre cet objectif. Merci d'avance.

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

une réponse simple/EXCELLENTE/exemple (essayez attraper) a été donnée à la même question à http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples doit lire, montre EXACTEMENT quoi faire en clair et des termes simples. –

+0

Cochez cette case http://dev.mysql.com/doc/refman/5.0/fr/commit.html. Cela devrait vous orienter dans la bonne direction. –

Répondre

6

Vous devez utiliser le mysqli extension pour utiliser cette fonctionnalité.

Voir: autocommit(), commit() et 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 Merci pour votre réponse. J'ai construit plus de 85% de mon application en utilisant mysql_query. Je pense que je vais devoir modifier mon application et la retravailler de zéro si je dois utiliser mysqli. Est-il possible de le faire en utilisant mysql_query? Je ne suis pas sûr de pouvoir passer à mysqli à ce moment-là, donc une solution alternative est très appréciée. En attente de votre réponse. – Devner

+2

Malheureusement pas. les fonctions mysql_ * n'offrent pas l'accès aux fonctionnalités avancées offertes par MySQL 4 et plus tard comme les transactions et les procédures stockées. Vous n'avez pas besoin de revenir en arrière et de changer tous les appels à MySQL pour utiliser mysqli. Changez juste les pages qui auront réellement besoin de l'utiliser. –

+0

Je vais essayer ça. Je vous remercie. – Devner

13

Vous n'avez pas besoin d'utiliser mysqli. Vous pouvez simplement émettre les commandes de transaction en tant que requêtes.

Donc, pour votre exemple:

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

Par leur façon, si vous songez à la mise à niveau Mysqli, s'il vous plaît ne pas. Mise à niveau vers PDO à la place, c'est beaucoup plus sain.

+0

Je pense que vous voulez dire mysql_query ("start transaction"); ou mysql_query ("begin"); – Rooster242

+0

Ouais, s'est mélangé entre les deux ... va réparer. – rjmunro

+0

mysql n'est pas sûr, essayez d'utiliser mysqli ou PDO – Asuquo12

Questions connexes