2017-04-26 57 views
0

我的問題如下:我想同時向表中添加多個項目。這是一個庫存系統,根據採購訂單,物品將被添加。我想同時更新3個表格。第一張表涉及發票數據,第二張表涉及收到的物品詳情。第三張表涉及當前股票。我可以在PHP for循環中使用ON DUPLICATE UPDATE KEY

如果我將添加到當前庫存表的項目已經存在,則應更新它,如果它不存在,則應將其添加到當前庫存表中。我使用動態生成的文本框將項目添加到表格。但我無法在for循環中執行ON DUPLICATE UPDATE KEY查詢。我的代碼如下所示。

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

項目名稱是current_stock表中的主鍵....只有兩列,Item_name和qty。 –

回答

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的攻擊,並且查詢只需要編譯和優化,一旦它運行得更快並且減少了數據庫服務器的負載。

同時多個更新shoudl真的在事務內完成,以確保數據庫的完整性。

$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

相關問題