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
相关产品推荐
相关产品推荐

