2011-03-09 20 views
7

php/mysql kullanıyorum. mysql'deki işlemi biliyorum ama betiğimde kullanamıyorum. Aşağıda i ROLLBACK, BEGINIşlem nasıl kullanılır? Php/mysql

foreach($json_a['shop'] as $jsondata=>$json) 
{ 
if($json['category']==='product') 
{ 
$name_product=$json['name']; 
$query1="insert into product(id,name,user_id)values('','" . mysql_real_escape_string($name_product). "','1')"; 

$result1=mysql_query($query1) or die("error in query".mysql_errno()); 
//echo "success...!"; 
$product++; 
} 
else 
if($json['category']==='order') 
{ 
$name_order=$json['name']; 
$query2="insert into order(id,name,user_id)values('','" . mysql_real_escape_string($name_order). "','1')"; 

$result2=mysql_query($query2) or die("error in query".mysql_errno()); 
$order++; 
} 
else 
if($json['category']==='sale') 
{ 
$name_sale=$json['name']; 
$query3="insert into sale(id,name,user_id)values('','" . mysql_real_escape_string($name_sale). "','1')"; 

$result3=mysql_query($query3) or die("error in query".mysql_errno()); 
$sale++; 
} 
}
+0

Sen doğru yerlerde bunları kullanarak ... bunları kullanabilir? Sorunuzu açıklayabilir misiniz, lütfen? Ne sorduğunu söylemek zor. – Charles

+0

İşlem hakkında soru soruyorum ve bazen sorgusunun amacı ilk sorgu yürütülür ve veri veritabanına eklenir, ancak ikinci sorgu doğru şekilde yürütülmez, böylece ekleme sırasının bozulmaması için işlemi geri almak istiyorum. – hunter

cevap

12

Basitçe mysql_query('START TRANSACTION'); sorunu ve ekler her birinde hatalarını kontrol

İşte bir örnek. Bunlardan biri, geri kalan sorgulardan hiçbirini yapmadan hemen bir ROLLBACK vermezse. Eğer her şey yolunda giderse, hepsi bir COMMIT çıkarır.

Eğer if-else ile çok fazla yuvalama seviyesi kullanmaktan kaçınmak için onları bir try-catch bloğuna koymak daha kolay olabilir.

// START TRANSACTION 
try{ 
    // INSERT 1 
    if(failed) 
     throw new Exception(); 

    // INSERT 2 
    if(failed) 
     throw new Exception(); 

    // INSERT 3 
    if(failed) 
     throw new Exception(); 

    // COMMIT 
} 
catch(Exception $e){ 
    // ROLLBACK 
} 

Ayrıca PHP en PDO extension içine bakmak isteyebilirsiniz. İşlemler özelliklerinin bir parçasıdır.

+0

+1, bunun ideal olarak nasıl yapılandırılacağının seksi, güzel özlü bir temsilidir. – philwinkle

+0

Sorguları iç içe geçirdim çünkü foreach döngüsünün bir parçası olan güncellenmiş soruma bakıyorum. – hunter

+0

@hunter Bu stratejiyi, sahip olduğunuz materyali kullanamazsınız. Sadece 'try' ile her şeyi sarın ve bir ROLLBACK'in kararlaştırıldığına karar verdiğinizde bir istisna atarsınız. Durumunuzda, aynı işlemde çalıştırılacak eklerden ikisi için gerçekleşemeyeceğini unutmayın, bu nedenle işlemler gerçekten gerekli değildir. Başka sorgular eklemeyi planlıyor musunuz? –

2

onlar işlemlerle ilgili düzenli MySQL tablolarda olduğu gibi aynı kurallar/sözdizimi burada geçerli yürütme benim code.i.e içinde php işlem nasıl kullanabileceğinizi benim senaryom.

işlemler için MySQL sözdizimi üzerine
$query0 = 'START TRANSACTION;'; 
mysql_query($query0) or die('woops' . mysql_error()); 

/* all of your queries here */ 

$query5 = 'COMMIT;'; 
mysql_query($query5) or die('woops' . mysql_error()); 

fazla bilgi burada bulunabilir: http://dev.mysql.com/doc/refman/5.0/en/commit.html

5

Bir seçenek PDO kullanmaktır. Örnek:

$db = new PDO($dsn,$user,$password); 

$db->beginTransaction(); 
$db->exec("delete from mytable"); 

$allGood = doSomethingElse(); 

if ($allGood) 
{ 
    $db->commit(); 
} else { 
    $db->rollBack(); 
} 

veya daha zarif bir yöntem:

$db = new PDO($dsn,$user,$password); 
$db->beginTransaction(); 

try{ 
    //first execution  
    $db->exec("delete from mytable"); 

    //second execution 
    $db->exec("insert into anothertable"); 

    //if all went well 
    $db->commit(); 

} catch (Exception $e) { 

    //something broke, hit undo 
    $db->rollBack(); 

} 
İlgili konular