如何通过多ID按钮动态调用ISSET?表单提交始终插入最后值
问题原因
你遇到的问题是因为循环中重复生成了name="model"的隐藏输入框,按照HTML规则,同名表单元素提交时只会保留最后一个的值,所以无论点击哪个按钮,后端拿到的$_POST['model']都是循环最后一行的model值。
解决方法
方法一:将model值绑定到提交按钮的value(最简单)
修改表单代码
移除循环里的隐藏输入框,直接把model值作为提交按钮的value:
<form method="post" action="" enctype="multipart/form-data"> <input type="text" class="form-control" placeholder="Numéro de chassit" name="chassit" id="chassit" > <?php if (mysqli_num_rows($result) > 0) { ?> <?php while($row = mysqli_fetch_array($result)) { ?> <?= "<img alt='' src='../admin/image/mercedes/".$row['image']."' >";?> <div class="card-body"> <!-- 移除隐藏的model输入框,直接用按钮的value传递model值 --> <input type="submit" name="mo" class="btn btn-secondary" value="<?= $row['model'] ?>"> </div> <?php } ?> <?php } ?> </form>
修改后端处理逻辑
直接用$_POST['mo']获取对应的model值:
<?php if(ISSET($_POST['mo'])){ $demandeur = $_SESSION['username']; $model = $_POST['mo']; // 直接取提交按钮的value $chassit = $_POST['chassit']; // 改用预处理语句防止SQL注入 $sql = "INSERT INTO tbl_xp_support (demandeur,model,chassit) VALUES (?,?,?)"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "sss", $demandeur, $model, $chassit); if (mysqli_stmt_execute($stmt)) { header("Location: ../xp_group.php"); exit; // 跳转后必须终止后续代码执行 } else { echo "Error: " . mysqli_error($con); } mysqli_close($con); } ?>
方法二:给每个提交按钮设置唯一的name
修改表单代码
给每个提交按钮的name加上model前缀,生成唯一标识:
<form method="post" action="" enctype="multipart/form-data"> <input type="text" class="form-control" placeholder="Numéro de chassit" name="chassit" id="chassit" > <?php if (mysqli_num_rows($result) > 0) { ?> <?php while($row = mysqli_fetch_array($result)) { ?> <?= "<img alt='' src='../admin/image/mercedes/".$row['image']."' >";?> <div class="card-body"> <input type="submit" name="mo_<?= $row['model'] ?>" class="btn btn-secondary" value="<?= $row['model'] ?>"> </div> <?php } ?> <?php } ?> </form>
修改后端处理逻辑
遍历$_POST找到被点击的按钮,提取对应的model值:
<?php $model = ''; // 遍历POST数据,定位以mo_开头的按钮标识 foreach($_POST as $key => $value){ if(strpos($key, 'mo_') === 0){ $model = substr($key, 3); // 截取mo_后缀的model值 break; } } if(!empty($model)){ $demandeur = $_SESSION['username']; $chassit = $_POST['chassit']; // 使用预处理语句防止SQL注入 $sql = "INSERT INTO tbl_xp_support (demandeur,model,chassit) VALUES (?,?,?)"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "sss", $demandeur, $model, $chassit); if (mysqli_stmt_execute($stmt)) { header("Location: ../xp_group.php"); exit; } else { echo "Error: " . mysqli_error($con); } mysqli_close($con); } ?>
重要安全提示
你原代码直接将用户输入拼接到SQL语句中,存在严重的SQL注入风险,上面的解决方法已改用mysqli预处理语句规避该问题,务必使用这种方式处理数据库操作。
内容的提问来源于stack exchange,提问作者walid
相关产品推荐
相关产品推荐

