PHP测验为何出现正确答案匹配错误问题?
问题修复:PHP测验程序答案匹配错误
你的问题核心是:每次提交表单时,页面会重新执行数据库查询获取新的随机题目,导致校验答案时用的是新题的正确答案,而不是用户刚才回答的那道题的答案,所以匹配逻辑完全失效。
修复思路
把当前显示题目的正确答案,通过表单的隐藏字段一起提交到后台,这样校验时就能拿到用户回答的那道题的正确答案,而不是重新查询的新答案。
修改后的完整代码
<?php include('connect_db.php'); $sqlstmt = 'SELECT * FROM quiz ORDER BY RAND() LIMIT 1'; $res = mysqli_query($dbc, $sqlstmt); $row = mysqli_fetch_assoc($res); $CorrectAnswer = $row['CorrectAnswer']; ?> <html> <head> <style> h1 { text-align: center; } .answer { display: flex; margin-inline: auto; margin-bottom: 1rem; } .button { margin-top: 1rem; } fieldset { display: flex; flex-direction: column; justify-content: center; width: 50rem; margin-inline: auto; } </style> </head> <body> <h1>Quiz</h1> <form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>" align="center" id='myForm'> <!-- 添加隐藏字段存储当前题的正确答案 --> <input type="hidden" name="correct_answer" value="<?php echo $CorrectAnswer; ?>"> <fieldset > <legend>Question:</legend><br> <p><?php echo $row['Question']; ?></p><br> <div class="answer"> <input type="radio" id="answer1" name="answer" value="<?php echo $row['Answer1']; ?>"><br> <label for="answer1"><?php echo $row['Answer1']; ?></label> </div> <div class="answer"> <input type="radio" id="answer2" name="answer" value="<?php echo $row['Answer2']; ?>"><br> <label for="answer2"><?php echo $row['Answer2']; ?></label> </div> <div class="answer"> <input type="radio" id="answer3" name="answer" value="<?php echo $row['Answer3']; ?>"><br> <label for="answer3"><?php echo $row['Answer3']; ?></label> </div> <div class="answer"> <input type="radio" id="answer4" name="answer" value="<?php echo $row['Answer4']; ?>"><br> <label for="answer4"><?php echo $row['Answer4']; ?></label> </div> </fieldset> <input class="button" type="submit" value="Submit"> </form> <script> function validateForm() { var radios = document.getElementsByName('answer'); var formValid = false; var i = 0; while (!formValid && i < radios.length) { if (radios[i].checked) formValid = true; i++; } if (!formValid) alert("You must select an option!"); return formValid; } var form = document.getElementById("myForm"); form.onsubmit = validateForm; </script> <?php if (isset($_POST['answer']) && isset($_POST['correct_answer'])) { $selectedAnswer = $_POST['answer']; $correctAnswer = $_POST['correct_answer']; if ($selectedAnswer == $correctAnswer) { echo '+1 pt'; } else { echo 'Wrong answer'; // 可选:添加错误提示 } } ?> </body> </html>
关键修改点
- 移除了多余的
while循环(因为你只查询一条数据,不需要循环遍历) - 在表单中添加隐藏字段,把当前题的正确答案随表单一起提交
- 校验逻辑改为使用提交过来的
correct_answer(用户刚才答题的正确答案)和answer对比,而不是重新查询数据库生成新答案
内容的提问来源于stack exchange,提问作者SpudOnPiano
相关产品推荐
相关产品推荐

