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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:22:42