购物车功能异常:点击不同商品均返回同一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 } } } ?>
额外提示
- 使用session前必须调用
session_start(),且要放在输出任何HTML内容之前 - 可添加逻辑避免重复添加同一商品到购物车
- 建议使用SQL预处理语句替代直接查询,防止SQL注入风险
内容的提问来源于stack exchange,提问作者user19241159
相关产品推荐
相关产品推荐

