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

购物车功能异常:点击不同商品均返回同一cabuid值问题排查

购物车添加商品异常:点击任意商品均存入第三个商品的cabuid

我正在为线上商店开发简易购物车系统,每个商品下方设置了「加入购物车」按钮,预期点击按钮时将所选商品对应的数据库uid(cabuid)存入当前会话。但实际测试时,无论点击哪个商品,会话中总是存入第三个商品的id(cabuid 3)。

数据库表boots包含字段:cabuid、cabname、cabdescription、cabprice、image


index.php 文件

<form  style="border:1px solid #ccc" method="POST"  enctype="multipart/form-data">

<?php 

if (isset($_POST['add'])){
    print_r($_POST['product_id']);
}

include __DIR__.'../includes/dbh.includes.php';
   
$sql = "SELECT * FROM boots";
$gotResults = mysqli_query($connection,$sql);

if($gotResults) {
    if(mysqli_num_rows($gotResults)>0) {
        while($row = mysqli_fetch_array($gotResults)){
?>

            <div class="row">
              <div class="column">
                <div class="card">
                  <img src="images/<?php echo $row['image']?>"  style="width:100%">
                  <div class="container">
                    <h2> 
                      <?php echo $row['cabname']; ?> </h2>
                    <p><?php echo $row['cabdescription']; ?></p>
                    <p><?php echo $row['cabprice']; ?> € </p>
                    <p><button type="submit" class="button" name="add">Add to cart</button></p>
                    <input type='hidden' name='product_id' value="<?php echo $row['cabuid']; ?>">
                  </div>
                </div>
              </div> 
<?php 
        }
    }
}
?>

dbh.includes.php 文件

<?php

$serverName = "localhost";
$dbUsername ="root";
$dbPassword ="";
$dbName = "webvacser";

$connection = mysqli_connect($serverName, $dbUsername, $dbPassword, $dbName);

if (!$connection) {
    die("Connection failed: " . mysqli_connect_error());
}
?>

问题原因&修复方案

问题根源

所有商品的表单元素都嵌套在同一个<form>标签内,循环输出商品时,每个商品的隐藏域product_id会重复生成。HTML中同名表单元素提交时,只会保留最后一个元素的值——也就是循环输出的最后一个商品(第三个)的cabuid,所以无论点击哪个按钮,提交的都是最后一个商品的ID。

修复代码

给每个商品单独创建<form>标签,将按钮与对应商品的隐藏域包裹在各自表单中:

<?php 
// 处理表单提交,注意先启动session
session_start();
if (isset($_POST['add'])){
    // 初始化购物车session
    if(!isset($_SESSION['cart'])){
        $_SESSION['cart'] = [];
    }
    // 将商品ID加入购物车
    $_SESSION['cart'][] = $_POST['product_id'];
    print_r($_POST['product_id']);
}

include __DIR__.'../includes/dbh.includes.php';
   
$sql = "SELECT * FROM boots";
$gotResults = mysqli_query($connection,$sql);

if($gotResults) {
    if(mysqli_num_rows($gotResults)>0) {
        while($row = mysqli_fetch_array($gotResults)){
?>

<div class="row">
  <div class="column">
    <div class="card">
      <img src="images/<?php echo $row['image']?>"  style="width:100%">
      <div class="container">
        <h2><?php echo $row['cabname']; ?></h2>
        <p><?php echo $row['cabdescription']; ?></p>
        <p><?php echo $row['cabprice']; ?> € </p>
        <!-- 每个商品独立表单 -->
        <form method="POST" enctype="multipart/form-data">
            <button type="submit" class="button" name="add">加入购物车</button>
            <input type='hidden' name='product_id' value="<?php echo $row['cabuid']; ?>">
        </form>
      </div>
    </div>
  </div> 
<?php 
        }
    }
}
?>

额外提示

  1. 使用session前必须调用session_start(),且要放在输出任何HTML内容之前
  2. 可添加逻辑避免重复添加同一商品到购物车
  3. 建议使用SQL预处理语句替代直接查询,防止SQL注入风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:05:24