2017-04-26 3 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' 테이블에 대한 KEY는 무엇입니까? – RiggsFolly

+0

'SHOW CREATE TABLE current_stock'의 출력을 보여주세요 – RiggsFolly

+0

항목 이름은 current_stock 테이블의 기본 키입니다 .... Item_name과 qty라는 두 개의 열만 있습니다. –

답변

0

ON DUPLICATE KEY UPDATE에 대한 구문이 잘못되었습니다.

당신은 col_name = col_name 또는 col_name = VALUES(col_name)

절을 쉼표로 구분되어 지정할 수 있습니다.

0

구문의 ON DUPLICATE 부분을 입력하면 업데이트 단계에 키 필드를 포함하면 안됩니다. 이미 색인/키 열을 복제본으로 찾았으므로 이미 알고 있습니다.

는 또한 UPDATE 구문은 단지 일반 UPDATE 구문처럼하고 필요로하는 당신이 더 안전하고 효율적으로 이와 같은 준비가 지정 된 쿼리를 사용 할 수

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

SET 절. 이것은 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

관련 문제