2011-03-09 13 views
7

私はphp/mysqlを使用しています。私はmysqlのトランザクションについて知っているが、私のスクリプトでは使用できない。下記の私は、ROLLBACK、BEGINphp/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

$db = new PDO($dsn,$user,$password); $db->beginTransaction(); $db->exec("delete from mytable"); $allGood = doSomethingElse(); if ($allGood) { $db->commit(); } else { $db->rollBack(); } 

以上のエレガントな方法?あなたの質問を明確にすることはできますか?あなたが求めていることを伝えるのは難しいです。 – Charles

+0

私はトランザクションについて質問していますが、私の質問の目的は最初にクエリが実行され、データがデータベースに挿入されますが、2番目のクエリが正しく実行されないので、挿入の順序が乱されないようにトランザクションをロールバックします。 – hunter

答えて

12

は単にmysql_query('START TRANSACTION');を発行して、インサートの一人一人でエラーをチェック。それらのうちの1つが成功しない場合は、残りのクエリを実行せずにすぐにROLLBACKを発行します。すべてがうまくいくとCOMMITが発行されます。

if-elseでネストのレベルが多すぎるのを避けるために、try-catchブロックに入れるほうが簡単かもしれません。

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

PHPのPDO extensionもご覧ください。トランザクションはその機能の一部です。

+0

+1これは理想的にどのように構造化されるべきかという、セクシーで素敵な簡潔な表現です。 – philwinkle

+0

更新された質問をforeachループで見ているという理由だけで、クエリをネストしました。 – hunter

+0

@hunterあなたはあなたが持っているものではなく、その戦略を使うことができます。 'try'で全てをラップして、ROLLBACKが義務付けられていると判断したら例外をスローします。 2つのインサートが同じ実行で実行されることはありませんので、トランザクションは実際には必要ありません。他のクエリを追加する予定ですか? –

2

彼らは、トランザクションに関する通常のMySQLの文で行うのと同じルール/構文はここに適用COMMIT私code.i.eでPHPのトランザクションを使用することができますどのように私のスクリプトです。取引のためのMySQLの構文上の

$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()); 

詳しい情報はここで見つけることができます:ここで

は一例ですhttp://dev.mysql.com/doc/refman/5.0/en/commit.html

5

1つの選択肢は、PDOを使用することです。例:あなたが適切な場所にで...それらを使用してそれらを使用することができ

$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(); 

} 
関連する問題