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

PHP提交产品ID到购物车仅提交最后一条产品ID问题求助

问题根源

你把所有产品的表单元素都放在了同一个全局form标签里,循环输出每个产品的时候,重复生成name为product_id和qty的隐藏字段,同名表单元素在提交时,后面的值会覆盖前面的值,所以最终提交的永远是循环到最后一个产品的ID。

修复方案

最简单的改法是把form标签放到产品循环内部,每个产品对应一个独立的表单,修改后的产品页代码参考:

<?php 
require_once 'db.php';
try {
    $STH = $DBH->prepare("SELECT * FROM products");
    $STH->execute();
    $rows_affected = $STH->rowCount();
    if ($rows_affected > 0){
        while($row = $STH->fetch()){
            $pro_id    = $row['product_id'];
            $pro_cat   = $row['product_cat'];
            $pro_image = $row['product_image'];
            $cat_name = $row["cat_title"];
            $pro_title = $row["product_title"]; // 补充你原代码缺失的变量赋值
            // 每个产品单独生成独立表单
            echo "
            <form method='POST' action='action.php'>
                <input type='hidden' class='form-control' name='product_id' value='$pro_id' required>
                <input type='hidden' class='form-control' name='qty' value='1' required>
                <div class='product'>
                   <a href='product.php?p=$pro_id'><div class='product-img'>
                   <img src='product_images/$pro_image' style='max-height: 170px;' alt=''>
                   </a>
                </div>
                <div class='product-body'>
                <p class='product-category'>$cat_name</p>
                <h3 class='product-name header-cart-item-name'><a href='product.php?p=$pro_id'>$pro_title</a></h3>
                <div class='product-btns'>
                <button type='submit' class='addToCart' name='addToCart'><i class='fa fa-shopping-cart'></i><span class='tooltipp'>Add to cart</span></button>
                </div>
                </div>
            </form>
            ";
        }
    }
} catch(PDOException $e){
    $_SESSION['error'] = "Couldn't fetch the products";
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
?>

其他可优化点

  • 你原代码的提交按钮没有加type="submit"属性,部分浏览器可能识别异常,补充后更稳妥
  • action.php中header('refresh:2; url=index.php');之前有echo输出内容,会触发header已发送的报错,建议把提示信息存入session,跳转后再输出,或者改用JS实现延迟跳转
  • action.php中插入数据库用到的$ip_add变量没有提前定义,会导致插入失败,需要补充获取用户IP的逻辑赋值

内容的提问来源于stack exchange,提问作者Denver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:03:00