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
相关产品推荐
相关产品推荐

