PHP无JS实现表单提交后隐藏已答Jeopardy题目的方法
无JavaScript实现Jeopardy答题板已答题目隐藏方案
核心实现逻辑完全基于PHP Session持久化作答状态,服务端渲染页面前判断题目是否已被作答,已作答题目不再渲染可点击的分值按钮,即可实现提交后自动隐藏的效果,全程不需要前端JS参与。
第一步:重构状态存储逻辑
在play.php文件最开头的session_start();之后,先初始化用于存储已答题目ID的Session数组,同时建议将零散的分类、题目、答案数组合并为结构化数组,减少重复判断代码:
<?php session_start(); // 首次访问初始化已答题目集合、分数 if (!isset($_SESSION['answered_questions'])) { $_SESSION['answered_questions'] = []; } if (!isset($_SESSION['Score'])) { $_SESSION['Score'] = 0; } // 结构化存储所有分类、对应分值的题目和答案 $categories = [ 1 => [ 'name' => '第一个分类名称', 'questions' => [ 100 => ['q' => '100分题目内容', 'a' => '对应答案'], 200 => ['q' => '200分题目内容', 'a' => '对应答案'], 300 => ['q' => '300分题目内容', 'a' => '对应答案'], 400 => ['q' => '400分题目内容', 'a' => '对应答案'], 500 => ['q' => '500分题目内容', 'a' => '对应答案'], ] ], // 按相同格式补全2-5号分类即可 ];
修改原有表单提交的跳转逻辑,跳转到题目页时带上当前题目的唯一标识:
if (isset($_POST['question'])) { $qid = $_POST['question']; // 从题目ID解析出分类ID和对应分值 sscanf($qid, "cat%d_%d", $catId, $point); $_SESSION["Question"] = $categories[$catId]['questions'][$point]['q']; $_SESSION["Answer"] = $categories[$catId]['questions'][$point]['a']; $_SESSION["Points"] = $point; // 跳转时携带题目ID,方便答完后标记状态 header("Location: questionPage.php?qid={$qid}"); exit; }
在questionPage.php的答案判分逻辑末尾,将当前做完的题目ID存入已答集合,再跳转回游戏主页:
// 答案判分、分数累加逻辑完成后执行 $qid = $_GET['qid']; // 将题目ID标记为已答 $_SESSION['answered_questions'][] = $qid; // 跳转回游戏板 header("Location: play.php"); exit;
第二步:页面渲染时按状态输出内容
渲染游戏板表格时,不要硬编码所有分值按钮,遍历题目列表时先判断当前题目是否在已答集合中,按需输出内容:
<form method="post"> <div id="container"> <table id="board"> <tr id="categories"> <?php foreach ($categories as $catId => $cat): ?> <th><?= $cat['name'] ?></th> <?php endforeach; ?> </tr> <?php foreach ([100,200,300,400,500] as $point): ?> <tr> <?php foreach ($categories as $catId => $cat): $qid = "cat{$catId}_{$point}"; // 已答题目直接输出空白单元格 if (in_array($qid, $_SESSION['answered_questions'])): ?> <td class="answered"></td> <?php else: ?> <!-- 未答题目输出可点击的提交按钮 --> <td> <button type="submit" name="question" value="<?= $qid ?>"><?= $point ?></button> </td> <?php endif; endforeach; ?> </tr> <?php endforeach; ?> </table> </div> </form>
注意事项
- 所有
header()跳转语句后必须加exit;终止后续代码执行,避免逻辑异常 - 你原有代码中存在中文全角右引号(比如数组元素里的
"x”"),请统一替换为半角双引号,否则会触发PHP语法错误 - 可以给已答单元格添加
.answered类,通过CSS设置为和游戏板背景一致的样式即可,不需要额外写显示/隐藏的判断逻辑 - 整个流程完全基于服务端状态存储+页面渲染,不需要任何JavaScript代码,完全符合需求要求
内容的提问来源于stack exchange,提问作者RitzP
相关产品推荐
相关产品推荐

