我可以在PHP for循环中使用ON DUPLICATE UPDATE KEY

时间:2017-04-26 11:41:48

标签: php mysql

我的问题如下..我想同时向表中添加多个项目。这是一个库存系统,根据采购订单,将添加项目。我想同时更新3个表。第一个表与发票数据有关,第二个表与收到的项目详细信息有关。第三个表与当前股票有关。

如果我要添加到当前库存表的项目已经存在,则应该更新它,如果它不存在,则应该将其添加到当前库存表中。我使用动态生成的文本框将项添加到表。但是我无法在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>';
        }
    }
}

2 个答案:

答案 0 :(得分:0)

ON DUPLICATE KEY UPDATE的语法错误。

您可以指定col_name = col_namecol_name = VALUES(col_name)

子句以逗号分隔。

答案 1 :(得分: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>';