PHP随机问答测验故障求助:提交答案匹配错误修复
修复PHP随机问答测验的答案匹配问题
问题描述
基于PHP和Bootstrap开发的随机问答测验页面,存在核心问题:用户提交答案时,系统总是用刷新后新生成的随机问题答案进行匹配,而非用户答题时显示的当前问题答案,导致答案判断完全错误。需要修复该问题,同时保证:
- 提交正确答案显示「Congratulations」,错误显示「Better luck Next Time」
- 每次刷新页面问题随机切换,功能正常
故障原因
每次页面加载(包括表单提交后的页面刷新)都会执行array_rand()生成新的随机问题,导致表单提交后,用于对比答案的$ans_key是新问题的答案,而非用户所答问题的对应答案。
修复后的完整代码
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Bootstrap demo</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="card mt-5"> <div> <h1 class="text-center alert bg-warning">let's Play Quiz</h1> </div> <div class="card-body"> <?php // 问题与答案数组 $ques = array( "q1" => "Ques:What is currency of India?", "q2" => "Ques:Which is the most populated state in India?", "q3" => "Ques:Which city is financial capital of India?", "q4" => "Ques:Which state has the largest land area ?", "q5" => "Ques:Which state is most literate?" ); $answers = array( "q1" => "rupee", "q2" => "Uttar Pradesh", "q3" => "Mumbai", "q4" => "rajasthan", "q5" => "Kerala" ); // 处理表单提交时,使用提交的问题ID;否则随机生成 if(isset($_REQUEST["subbtn"])){ $current_q = $_REQUEST["q_id"]; } else { $current_q = array_rand($ques); } $current_question = $ques[$current_q]; $current_answer = $answers[$current_q]; ?> <h5 class="card-title text-center"> <?php echo $current_question; ?> </h5> <form action="" method="post"> <!-- 隐藏字段存储当前问题ID --> <input type="hidden" name="q_id" value="<?php echo $current_q; ?>"> <input type="text" name="ans" required placeholder="Enter your answer here" class="mx-auto my-2 d-block"> <br> <input type="submit" value="Submit Answer" name="subbtn" class="btn btn-warning btn-sm d-block mx-auto"> </form> </div> <div class="card-footer bg-warning"> <small class="text-dark"> <?php if (isset($_REQUEST["subbtn"])) { $user_input = trim($_REQUEST["ans"]); // 去除输入首尾空格 $compare_result = strcasecmp($current_answer, $user_input); if ($compare_result == 0) { echo "Congratulations"; } else { echo "Better luck Next Time"; } } ?> </small> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.min.js" integrity="sha384-Rx+T1VzGupg4BHQYs2gCW9It+akI2MM/mndMCy36UVfodzcJcF0GGLxZIzObiEfa" crossorigin="anonymous"></script> </body> </html>
修复说明
- 新增隐藏字段:在表单中添加
name="q_id"的隐藏输入框,存储当前显示问题的ID(如q1/q2),提交表单时一同传递给后端,确保对比的是用户所答问题的答案 - 调整问题生成逻辑:表单提交时,优先使用提交过来的
q_id获取对应问题和答案;未提交时,随机生成新问题,兼顾答案匹配正确性和页面刷新的随机性 - 修复语法错误:补全原代码中被注释的变量定义,以及缺失的大括号,保证代码可正常执行
- 优化输入处理:添加
trim()去除用户输入的首尾空格,避免因空格导致的误判
内容的提问来源于stack exchange,提问作者Learn Code
相关产品推荐
相关产品推荐

