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

PHP草地滚球计分系统如何为动态生成的多组单选按钮设置不同name属性

问题原因

你代码里的错误主要有两个:

  • 平局计数变量$p的定义位置错误:你把$p = 0写在了平局判断的分支内,每遇到一场平局$p都会被重置为0,导致所有平局的单选按钮组name属性都为draw0,多场平局的单选按钮会被识别为同一组,提交时只会保留最后选中的值,也会出现你说的isset($_POST['draw0'])判断异常的问题。
  • 提交校验逻辑不完整:你只校验了draw0是否存在,若有多场平局,会生成draw1、draw2等多个name属性,你的校验逻辑没有覆盖这些参数。
修复方案

推荐用数组形式定义单选按钮的name属性,后端接收更方便,不需要提前知道平局数量,修复后的代码如下:

<?php
// 先统计平局总数,用于提交后的校验
$drawCount = 0;
foreach($gameWinners as $gw) {
    if ($gw[6]) $drawCount++;
}

// 校验所有平局是否都已选择获胜方
$allDrawSelected = true;
if ($drawCount > 0 && isset($_POST['draw'])) {
    foreach($_POST['draw'] as $d) {
        if (empty($d)) {
            $allDrawSelected = false;
            break;
        }
    }
}

if ($drawCount == 0 || !$allDrawSelected) {
?>
<form name="displayWinners" action="processScores.php" onsubmit="return validateForm()" method="post">
    <table width="70%" align="center" border="1">
        <tr width="80%" align="center" >
            <td align="center" colspan="2"><h2>Winners of individual games</h2></td>
        </tr>
        <?php
        $p = 0; // 平局计数器移到循环外部初始化
        for ($w = 0; $w < count($gameWinners); $w++){
        ?>
            <tr width="70%" align="center">
                <td width="15%" >
                    <b><?php echo "Rink ". $gameWinners[$w][5]; ?></b> 
                </td>   
                <td align="center">
                    <?php 
                    if ($gameWinners[$w][6] == true) {  // 比赛为平局
                        echo "This game was a draw. Select the agreed winner - ". ($gameWinners[$w][4]-1)."  ";
                        $f = ($gameWinners[$w][4] - 1);  // 队伍编号
                    ?>
                    <!-- 用数组形式作为name,提交后直接是按平局顺序排列的数组 -->                   
                    <input type="radio" name="draw[<?php echo $p; ?>]" value="<?php echo $f; ?>" required /><?php echo $team[$f][2]."'s team"; ?>
                    <input type="radio" name="draw[<?php echo $p; ?>]" value="<?php echo ($f + 1); ?>" required /><?php  echo $team[$f+1][2]."'s team"; ?>
                    <?php
                        $p++; // 处理完一场平局,计数器自增
                    }else{
                        $n = ($gameWinners[$w][4] - 1 );
                        if ($gameType == 2){
                    ?>
                        <b><?php echo  " ".$team[$n][2].",   ". $team[$n][3]; ?></b>
                    <?php 
                        }elseif ($gameType == 3){
                    ?>
                        <b><?php echo @$team[$n][2].",   ". @$team[$n][3].",   ". @$team[$n][5]; ?></b>
                    <?php  
                        }elseif ($gameType == 4){
                    ?>
                        <b><?php echo $team[$n][2].",   ". $team[$n][3].",   ". $team[$n][4].",   ". $team[$n][5]; ?></b>
                    <?php    
                        }
                    }
                    ?>
                </td>
            </tr>
        <?php
        }
        ?>
        <!-- 提交按钮,原有代码缺失可按需调整 -->
        <tr>
            <td colspan="2" align="center"><input type="submit" value="确认获胜名单"></td>
        </tr>
    </table>
</form>
<?php
} else {
    // 所有平局都已选择,处理后续逻辑
    // $_POST['draw'] 就是按平局顺序排列的获胜队伍编号数组,直接遍历使用即可
}
?>
额外优化说明
  • 给单选按钮加了required属性,前端就会自动校验每个平局组都必须选一个选项,降低后端校验压力
  • 用数组形式接收平局选择结果,不管有多少场平局,都可以直接遍历$_POST['draw']获取所有选中的获胜队伍,不需要单独判断draw0、draw1等参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:45:08