2017-04-26 11 views
0

私の問題は次のとおりです。複数の項目を同時にテーブルに追加したいと思います。これは在庫システムであり、購買発注に応じて明細が追加されます。私は同時に3つのテーブルを更新したい。第1の表は請求書データに関連し、第2の表は受信した明細の詳細に関する。 3番目の表は、現在の株式に関連しています。PHPのループでON DUPLICATE UPDATE KEYを使用することはできますか?

現在の在庫表に追加する項目がすでに存在する場合は更新する必要があり、存在しない場合は現在の在庫表に追加する必要があります。私はテーブルに項目を追加するために動的に生成されたテキストボックスを使用します。しかし、私はON DUPLICATE UPDATE KEYのforループでクエリを実行することができません。私のコードは次の通りです。

if (is_array($qty) && ($item)) { 
    for ($i = 0; $i < sizeof($qty); $i++) { 
     $query2 = "INSERT INTO received_items (po_id,invoice_number,item_name,qty)VALUES($id,'$invoice',$item[$i]',$qty[$i])"; 
     $query3="INSERT INTO current_stock (item-name,Qty) VALUES('$item[$i]',$qty[$i]) ON DUPLICATE KEY UPDATE item-name='$item[$i]',qty=qty+$qty[$i]"; 
     $result_1 = mysqli_query($conn, $query2); 
     $result_2 = mysqli_query($conn, $query3); 

     if (($result_1)&&($result_2)) { 
      echo '<script type="text/javascript">'; 
      echo 'alert("Sucessfully Updated your Details");'; 
      echo 'window.location = "../htdocs/dashbd.php";'; 
      echo '</script>'; 
     }else{ 
      echo '<script type="text/javascript">'; 
      echo 'alert("Failed to Update Your details.Try Again");'; 
      echo 'window.location = "../htdocs/received_item.php";'; 
      echo '</script>'; 
     } 
    } 
} 
+0

あなたの 'current_stock'テーブルにはどのようなキーがありますか? – RiggsFolly

+0

'SHOW CREATE TABLE current_stock'の出力を表示してください – RiggsFolly

+0

item nameはcurrent_stockテーブルの主キーです.... Item_nameとqtyの2つの列しかありません。 –

答えて

0

ON DUPLICATE KEY UPDATEの構文が間違っています。

あなたはcol_name = col_namecol_name = VALUES(col_name)

句はコンマで区切ります指定することができます。

0

構文のON DUPLICATE部分を入力すると、キーフェーズを更新フェーズに含めるべきではなく、既にインデックス/キー列が重複として検出されたことが分かります。

またUPDATE構文は普通のUPDATE構文のようなもので、SET句を必要と

$query3="INSERT INTO current_stock 
       (item-name,Qty) 
     VALUES('$item[$i]',$qty[$i]) 
     ON DUPLICATE KEY 
      UPDATE SET Qty=Qty+$qty[$i]"; 

また、このような準備とパラメータ化クエリを使用して、より安全かつ効率的にこれを行うことができます。これにより、SQL Injection Attackから保護されます。また、クエリがコンパイルされ、最適化されていれば、クエリを高速化し、データベースサーバーの負荷を軽減する必要があります。

また、データベースの整合性を保証するために複数の更新が実際にトランザクション内で実行されます。

$query2 = "INSERT INTO received_items 
       (po_id,invoice_number,item_name,qty) 
      VALUES(?,?,?,?)"; 
$query3 = "INSERT INTO current_stock 
       (item-name,Qty) 
      VALUES(?,?) 
      ON DUPLICATE KEY 
      UPDATE SET qty=qty+?"; 

$stmt2 = $conn->prepare($query2); 
$stmt3 = $conn->prepare($query3); 

// start a transaction 
$conn->begin_transaction(); 

for ($i = 0; $i < sizeof($qty); $i++) { 
    // you may need to check the data types used here???? 
    $stmt2->bind_param('iisi',$id,$invoice,$item[$i],$qty[$i]); 
    $result2 = $stmt2->execute();   

    // you may need to check the data types used here also ???? 
    $stmt3->bind_param('iii',$id,$qty[$i],$qty[$i]); 
    $result3 = $stmt3->execute();   

    if (!$result2 || !$result3) { 
     // we got an error, rollback all changes 
     $conn->rollback(); 
     echo '<script type="text/javascript">'; 
     echo 'alert("Failed to Update Your details.Try Again");'; 
     echo 'window.location = "../htdocs/received_item.php";'; 
     echo '</script>'; 
     exit; 
    } 
} 

// if we get here we did not get an error 
// commit the updates 
$conn->commit(); 
echo '<script type="text/javascript">'; 
echo 'alert("Sucessfully Updated your Details");'; 
echo 'window.location = "../htdocs/dashbd.php";'; 
echo '</script>'; 
+0

この回答を更新してトランザクションを組み込み、エラーまたは成功の報告を修正しました – RiggsFolly

関連する問題