2010-01-25 11 views
5

MY PLATFORMU:PHP & mySQL: Basit kod İşlem uygulamak - Commit & Geri Alma

PHP & mySQL

MY DURUM: Benim kod içinde işlem uygulamak için çalışıyorum

. Örnekleri takip etmeye çalıştım, ama çok fazla yardım değil. 3 sorgu çalıştırıyorum ve böyle bir şekilde bir işlem yazmak istedim, böylece herhangi bir sorgu (lar) başarısız olursa, tüm işlem geri dönmelidir. Bu hedefe ulaşmak için basit, verimli ve nesneye yönelik olmayan PHP kodu'u gerçekten takdir ediyorum. Şimdiden teşekkür ederim.

MY PHP KODU:

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

http://stackoverflow.com/questions/2708237/php-mysql-transactions adresinde aynı soruya basit ve MÜKEMMEL bir cevap/örnek (catch catch) verilmiş, örneklerin okuması yeterlidir, net olarak ne yapılacağını gösterir. ve basit terimler. –

+0

Bu http://dev.mysql.com/doc/refman/5.0/en/commit.html adresini kontrol edin. Bu sizi doğru yöne yönlendirmeli. –

cevap

6

Bu işlevi kullanmak için mysqli extension kullanmak gerekir.

Bkz: autocommit(), commit() ve 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 Cevabınız için teşekkür ederiz. Uygulamamın% 85'inden fazlasını mysql_query kullanarak oluşturdum. Uygulamamı değiştirmem gerekecek ve eğer mysqli kullanmam gerekiyorsa onu sıfırdan çalışmam gerekecek. Herhangi bir şekilde mysql_query kullanarak yapmak mümkün mü? Bu noktada mysqli'ye geçebileceğime pek emin değilim, bu yüzden alternatif bir çözüm çok takdir ediliyor. Cevabınızı bekliyoruz. – Devner

+2

Ne yazık ki hayır. mysql_ * fonksiyonları, MySQL 4 ve daha sonra işlemler ve saklı prosedürler gibi sunulan gelişmiş özelliklere erişim sunmaz. Mysqli kullanmak için MySQL'e geri dönüp her aramayı değiştirmenize gerek yok. Sadece kullanması gerekecek sayfaları değiştirin. –

+0

Bunu deneyeceğim. Teşekkür ederim. – Devner

13

Sen mysqli kullanmaya gerek yoktur. İşlem komutlarını sadece sorgu olarak yayınlayabilirsiniz. Yani örneğin

:

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

sen MySQLi yükseltme hakkında düşünüyorsun onlar yolu olarak, lütfen yapma. Bunun yerine PDO'ya yükseltin, daha aklı başında.

+0

Sanırım mysql_query ("start transaction") demek istediniz; veya mysql_query ("başlangıç"); – Rooster242

+0

Evet, ikisi arasında karıştı ... Düzeltecek. – rjmunro

+0

mysql güvenli değil, mysqli veya PDO kullanarak deneyin – Asuquo12

İlgili konular