PHP循环生成多表单:如何根据状态禁用对应表单按钮?
解决批量表单提交按钮错误禁用的问题
问题背景
你遇到的情况是:通过foreach循环从tbl_packages表生成结构一致的多份表单,希望实现仅当tbl_lendinglogs中对应套餐的status值为1时,禁用该表单的提交按钮,但原代码运行后所有按钮都被禁用,哪怕存在status为0的套餐。
原代码问题分析
核心问题在于状态查询没有和当前循环的套餐ID绑定,而且用来控制禁用状态的变量会被最后一次循环的结果覆盖,导致所有按钮共享同一个状态值,无法实现按套餐独立控制。
修复后的代码实现
我们需要在遍历每个套餐的循环内部,针对当前套餐的PkgID单独查询tbl_lendinglogs中的状态,确保每个表单的按钮都能获取到对应套餐的状态:
<?php $userID = $_SESSION['username']['UserID']; $query = "Select * from tbl_packages"; $result = mysqli_query($conn,$query); $num = mysqli_num_rows($result); foreach($result as $data): $PkgID = $data['id']; $PkgAmount = $data['amount']; $PkgFees = $data['fees']; $PkgPeriod = $data['period']; $ReturningAmount = $data['returnAmount']; // 针对当前套餐ID,查询用户对应的借贷日志状态 $queryCheckPackage = "select * from tbl_lendinglogs where UserID = '$userID' and pkg_id = '$PkgID'"; $resultCheckPackage = mysqli_query($conn,$queryCheckPackage); $pkgStatus = 0; // 默认状态为0,按钮保持可用 // 获取查询到的状态值(如果存在对应记录) if ($row = mysqli_fetch_array($resultCheckPackage)) { $pkgStatus = $row['status']; } ?> <form action="" class="form-inline" method="POST" id="buyPackage-init-<?php echo $PkgID; ?>" > <input class="form-control form-control-user" name="PkgID" id="PackagegID-<?php echo $PkgID; ?>" value="<?php echo $PkgID; ?>" readonly > <!-- 其他表单输入字段... --> <input class="btn btn-primary btn-user btn-block" onclick="return confirm('Confirm before buy?');" type="submit" id="btn-<?php echo $PkgID; ?>" data-target="#buyPackage" value="Invest" name="bttn-order" <?php if ($pkgStatus == 1) echo 'disabled="disabled"' ?>/> </form> <?php endforeach; mysqli_close($conn); ?>
关键优化说明
- 绑定套餐ID查询:在每个套餐的循环内部执行状态查询,确保每个表单的状态判断都是基于当前套餐的,不会被其他套餐的结果覆盖。
- 避免重复ID:给表单和元素的ID添加
$PkgID后缀(比如btn-<?php echo $PkgID; ?>),解决多个表单/元素ID重复的潜在问题。 - 默认状态兜底:设置
$pkgStatus默认值为0,确保没有对应日志记录的套餐按钮默认处于可用状态。
安全提示
原代码中的SQL查询存在SQL注入风险,建议改用预处理语句提升安全性,示例如下:
$queryCheckPackage = "select * from tbl_lendinglogs where UserID = ? and pkg_id = ?"; $stmt = mysqli_prepare($conn, $queryCheckPackage); mysqli_stmt_bind_param($stmt, "ii", $userID, $PkgID); mysqli_stmt_execute($stmt); $resultCheckPackage = mysqli_stmt_get_result($stmt);
内容的提问来源于stack exchange,提问作者Ali Usman
相关产品推荐
相关产品推荐

