You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL批量更新问题:如何一次提交单独更新多行数据?

解决PHP+MySQL多行更新时批量覆盖的问题

嘿,我一眼就发现你的问题根源了:每次循环执行UPDATE时,WHERE条件用的是receipt_no = '$no',这会把所有拥有相同receipt_no的行都更新一遍。循环跑完后,所有行自然都会变成最后一次循环的数值,这就是为啥其他行也被改成一样的值啦。

要实现每行单独更新,你需要给每行一个唯一的“身份证”——也就是数据库表的主键(比如id字段),用它来精准定位要更新的那一行。下面是具体的修改步骤:

1. 先改HTML表单:把每行的主键传去后端

在循环输出表单行的时候,加一个隐藏输入框,把当前行的主键(假设你的表主键是id)存进去,这样PHP就能知道每个输入框对应数据库里的哪条记录:

<?php while($receipt_row = mysqli_fetch_array($receipt_fetch)){
echo" 
<tr> 
<!-- 新增隐藏域,存储当前行的唯一id -->
<input type='hidden' name='id[]' value='$receipt_row[id]'>
<td> 
<input type='text' name='item[]'value='$receipt_row[item]' required> 
</td> 
<td class='text-right'> 
<input type='number'name='quantity[]' value='$receipt_row[quantity]' required> 
</td> 
<td class='text-right'> 
<input type='number'name='price[]' value='$receipt_row[price]'required> 
</td> 
<td class='text-right'> 
<input type='text' name='discount[]' value='$receipt_row[discount]'> 
</td> 
</tr>";
} ?>
<input type="submit" value="Update Receipt" name="submit">

2. 再改PHP代码:用主键精准更新单行

在循环更新的时候,取出对应的id,把WHERE条件改成用id来定位,这样每次循环只会更新指定的那一行,不会影响其他行:

$receipt = "SELECT * FROM receipt_tbl WHERE receipt_no = '$no' ";
$receipt_fetch = mysqli_query($con,$receipt) or die("we");
$count = mysqli_num_rows($receipt_fetch);

if (isset($_POST['submit'])){
    for($num=0;$num<$count ; $num++) {
        // 获取当前行的唯一id
        $id = $_POST['id'][$num];
        $item = $_POST['item'][$num];
        $quantity = $_POST['quantity'][$num];
        $price = $_POST['price'][$num];
        $discount = $_POST['discount'][$num];
        
        // 把WHERE条件换成id,精准定位要更新的单行
        $query2 = "UPDATE `receipt_tbl` SET 
            `receipt_no`='$rcpt',
            `item`='$item',
            `quantity`='$quantity',
            `price`='$price',
            `discount`='$discount' 
            WHERE id = '$id'";
        $update2 = mysqli_query($con,$query2) or die("we2");
    }
}

3. 非常重要:修复SQL注入漏洞

你的现有代码直接把用户输入拼进SQL里,这是高危的SQL注入风险!强烈建议改用MySQLi的预处理语句,既安全又规范,示例如下:

if (isset($_POST['submit'])){
    // 先准备好预处理语句模板
    $stmt = $con->prepare("UPDATE `receipt_tbl` SET 
        `receipt_no`=?, `item`=?, `quantity`=?, `price`=?, `discount`=? 
        WHERE id = ?");
    
    // 绑定参数:参数类型根据你的字段类型调整(s=字符串,i=整数,d=浮点数)
    $stmt->bind_param("ssidsi", $rcpt, $item, $quantity, $price, $discount, $id);
    
    foreach ($_POST['id'] as $num => $id) {
        $item = $_POST['item'][$num];
        $quantity = $_POST['quantity'][$num];
        $price = $_POST['price'][$num];
        $discount = $_POST['discount'][$num];
        
        // 执行当前行的更新
        $stmt->execute();
    }
    $stmt->close();
}

这样改完,就能一次性提交实现每行单独更新,同时也解决了安全问题~

内容的提问来源于stack exchange,提问作者John Jerome Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:14