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

PHP单选按钮未选中时出现Undefined array key警告问题求助

解决PHP测验中未选中单选按钮时的Undefined Array Key警告

这个问题很常见,原因其实很直白:当用户没有选择某个问题的单选按钮时,对应的answers[QuestionNo]参数根本不会被提交到服务器的$_POST数组里。所以当你循环遍历所有问题,直接尝试访问$Answers[$QuestionNo]的时候,这个数组键就不存在,自然会抛出"Undefined array key"警告。

下面是具体的修复方案,我们一步步调整你的代码:

1. 安全获取用户提交的答案

在遍历问题的循环里,先检查当前问题的答案是否存在,避免直接访问不存在的数组键。可以用PHP的**null合并运算符??**来优雅处理这种场景:

if (isset($_POST['answers'])){ 
    $Answers = $_POST['answers']; 
    $counter = 0; // 提前初始化计数器,避免undefined变量
    
    foreach ($Questions as $QuestionNo => $Value){ 
        // 安全获取用户答案,不存在则设为null
        $userAnswer = $Answers[$QuestionNo] ?? null;
        
        // 输出问题
        echo $Value['Question'].'<br />'; 
        
        // 分三种情况处理:未回答、回答错误、回答正确
        if ($userAnswer === null) {
            // 用户没选这个题
            echo '<span style="color: orange;">你没有回答这个问题</span><br>';
            echo '正确答案: <span style="color: green;">'.$Value['Answers'][$Value['CorrectAnswer']].'</span>';
        } elseif ($userAnswer != $Value['CorrectAnswer']){ 
            // 回答错误
            echo '你的答案: <span style="color: red;">'.$Value['Answers'][$userAnswer].'</span><br>'; 
            echo '正确答案: <span style="color: green;">'.$Value['Answers'][$Value['CorrectAnswer']].'</span>'; 
        } else { 
            // 回答正确
            echo '你的答案: <span style="color: green;">'.$Value['Answers'][$userAnswer].'</span><br>'; 
            echo '回答正确!<span style="color: green;">'.$Value['Answers'][$userAnswer].'</span>'; 
            $counter++; 
        } 
        echo '<br /><hr>'; 
    } 
    
    // 输出最终得分
    $results = "你的得分: $counter/2";
    echo $results; 
}

2. 移除错误抑制符,规范变量初始化

原来的代码用了@$counter++;这种错误抑制符,这是不推荐的写法——它会掩盖潜在的问题,也不利于代码调试。我们直接在循环前初始化$counter = 0,就能避免变量未定义的问题。

3. 可选:给单选按钮组添加默认值(备选方案)

如果你希望即使用户没选,也能提交一个默认值,可以在每个问题的单选按钮循环结束后,添加一个隐藏输入框:

<?php foreach ($Value['Answers'] as $Letter => $Answer){ 
    $Label = 'question-'.$QuestionNo.'-answers-'.$Letter;
?>
    <div>
        <input type="radio" name="answers[<?php echo $QuestionNo; ?>]" id="<?php echo $Label; ?>" value="<?php echo $Letter; ?>" />
        <label for="<?php echo $Label; ?>"><?php echo $Letter; ?>) <?php echo $Answer; ?> </label>
    </div>
<?php } ?>
<!-- 添加隐藏输入,确保即使未选也会提交空值 -->
<input type="hidden" name="answers[<?php echo $QuestionNo; ?>]" value="" />

这样即使用户没选,answers[QuestionNo]也会以空字符串的形式提交,不会出现数组键不存在的问题。不过这种方式需要在处理逻辑里判断空字符串,还是第一种方案的逻辑更清晰直观。

经过这些调整,当用户没选某个问题提交时,代码会友好提示未回答,同时彻底解决Undefined array key的警告问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:07:36