PHP购物车代码异常:多商品时首个商品数量无法修改
问题分析与修复方案
嘿,我找到你购物车首个商品数量无法修改的问题根源啦!
问题原因
你的问题出在数量更新逻辑的变量关联错误上。看你处理数量更新的这段代码:
if(isset($_POST['qty'])) { foreach($_POST['qty'] as $qty_id) { $update_qty = "UPDATE cart SET qty = '$qty_id' WHERE p_id = '$pro_id' AND ip_add = '$ip'"; $run_qty = mysqli_query($con, $update_qty) or die(mysqli_error($con)); } }
前面遍历商品时,$pro_id会被不断覆盖,循环结束后它只保留了最后一个商品的ID。而你提交的qty[]是无关联的数组,更新时所有数量都会被错误地应用到最后一个商品上,第一个商品自然得不到正确更新。
而且你还没把数量和对应的商品ID绑定,程序根本不知道哪个数量对应哪个商品。
修复步骤
我给你分两步改,保证解决问题:
1. 修改数量输入框,绑定商品ID
把循环里的数量输入框代码:
<input type="text" name="qty[]" value = "<?php echo $pro_qty;?>">
改成:
<input type="text" name="qty[<?php echo $pro_id; ?>]" value = "<?php echo $pro_qty;?>">
这样提交后,每个数量值都会和对应的商品ID绑定成关联数组。
2. 重构数量更新逻辑
把原来的数量更新代码替换成:
if(isset($_POST['qty'])) { foreach($_POST['qty'] as $pro_id => $new_qty) { // 确保数量是正整数,避免非法值 $new_qty = intval($new_qty); if($new_qty > 0) { $update_qty = "UPDATE cart SET qty = '$new_qty' WHERE p_id = '$pro_id' AND ip_add = '$ip'"; $run_qty = mysqli_query($con, $update_qty) or die(mysqli_error($con)); } else { // 数量为0时直接删除商品,更符合购物车逻辑 $delete_product = "DELETE FROM cart WHERE p_id = '$pro_id' AND ip_add = '$ip'"; $run_delete = mysqli_query($con, $delete_product); } } }
额外提醒
你的代码现在有SQL注入风险,建议换成预处理语句来操作数据库,比如更新数量可以改成这样:
$update_qty = $con->prepare("UPDATE cart SET qty = ? WHERE p_id = ? AND ip_add = ?"); $update_qty->bind_param("iis", $new_qty, $pro_id, $ip); $update_qty->execute(); $update_qty->close();
这样能大幅提升代码安全性哦!
内容的提问来源于stack exchange,提问作者djolefjc
相关产品推荐
相关产品推荐

