如何设置radio类型input变量?解决Undefined index: response报错
解决Undefined index: response的问题
这个报错的核心原因有两个:
- 你的前端循环生成了10个问题,但所有单选按钮的
name都是response,同时每个问题都输出了一个name="id"的隐藏输入——这会导致提交表单后,$_POST['id']只会保留最后一个问题的ID,$_POST['response']也只会保留最后一个被选中的单选值;如果用户没有选中任何单选按钮就提交,$_POST['response']根本不存在,直接访问就会触发这个Undefined index的提示。 - 后端代码没有先检查
$_POST['response']是否存在,就直接赋值给$rsp。
第一步:修改前端表单代码
我们需要让每个问题的单选按钮组拥有独立的标识,用数组形式命名,把问题ID作为数组的键,这样后端就能拿到每个问题对应的答案。同时去掉重复的name="id"隐藏输入,因为我们可以通过单选按钮的name数组来获取问题ID:
<form action="includes/backend_quiz.php" method="post"> <?php $query=mysqli_query($conn, "SELECT * FROM quiz order by rand() LIMIT 10") or die("Could not retrieve data: " .mysqli_error($conn)); if (mysqli_num_rows($query) > 0){ while($row = mysqli_fetch_assoc($query)){ extract($row); ?> <h4><?php echo $id ?>.  <?php echo $quation; ?></h4><br /> <!-- 把radio的name改成response[$id],绑定当前问题的ID --> <input type="radio" name="response[<?php echo $id; ?>]" value="a" /><?php echo $opt1;?><br /> <input type="radio" name="response[<?php echo $id; ?>]" value="b" /><?php echo $opt2;?><br /> <input type="radio" name="response[<?php echo $id; ?>]" value="c" /><?php echo $opt3;?><br /> <input type="radio" name="response[<?php echo $id; ?>]" value="d" /><?php echo $opt4;?><br /> <br/> <?php } } ?> <input type="submit" name="ans" value="Finish"/> </form>
第二步:修改后端处理代码
现在$_POST['response']会是一个关联数组,键是问题ID,值是用户选中的选项。我们需要先检查这个数组是否存在,再遍历处理每个问题的答案:
if(isset($_POST['ans'])){ // 先检查response数组是否存在且不为空 if(isset($_POST['response']) && is_array($_POST['response'])){ $correctCount = 0; // 遍历每个用户提交的答案 foreach($_POST['response'] as $questionId => $userAnswer){ // 这里可以根据questionId从数据库查询正确答案,示例代码(注意后续要优化为预处理语句) $query = mysqli_query($conn, "SELECT correct_opt FROM quiz WHERE id = $questionId"); $correctRow = mysqli_fetch_assoc($query); $correctAnswer = $correctRow['correct_opt']; if($userAnswer === $correctAnswer){ $correctCount++; } } // 后续可以处理$correctCount,比如输出得分等 } else { // 用户没有选择任何选项时的提示 echo "请至少选择一个选项!"; } }
额外安全提示
为了避免SQL注入风险,记得把数据库查询改成预处理语句,比如上面查询正确答案的部分可以优化为:
$stmt = mysqli_prepare($conn, "SELECT correct_opt FROM quiz WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $questionId); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $correctAnswer); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt);
内容的提问来源于stack exchange,提问作者Milind
相关产品推荐
相关产品推荐

