PHP单词解谜程序$response重复显示问题求助
问题修复方案
核心问题分析
你的代码存在两个关键问题导致$response重复显示:
- 页面每次加载都重复添加问题消息到聊天历史:页面初始化阶段的顶部PHP代码会生成
$response并直接推入$_SESSION['chat_history'],包括用户提交答案后重定向回来的加载,这就导致每次刷新都会新增一条问题消息,和之前的回复重复。 - 计数器赋值错误:
$_SESSION['num_words_generated'] =+ $num_words_generated;中的=+是语法错误,应该是+=,否则计数器永远不会递增,一直停留在初始值0。
修复代码
1. 调整聊天历史的添加逻辑
仅在首次加载或用户提交答案后需要生成新问题时,才将问题消息加入聊天历史,而非每次页面加载都添加。修改顶部的PHP代码:
<?PHP include 'functions/generate_word.php'; session_start(); // 确保session已启动,若其他位置已添加可忽略 $num_words_generated = isset($_SESSION['num_words_generated']) ? $_SESSION['num_words_generated'] : 0; // 修复计数器递增逻辑 $num_words_generated += 1; $_SESSION['num_words_generated'] = $num_words_generated; $item_num = $num_words_generated; $random_word_jumbled = str_shuffle($currentWord); $new_question_response = "<div id='output-container'><p>Question #" . $item_num . "<br>Unscramble the word: <strong>" . $random_word_jumbled . "</strong></p></div>"; // 初始化聊天历史 if (!isset($_SESSION['chat_history'])) { $_SESSION['chat_history'] = array(); // 首次加载时添加第一个问题 array_push($_SESSION['chat_history'], $new_question_response); } else { // 仅在用户提交答案后重定向回来,且未达10题时添加新问题 $is_post_redirect = isset($_SESSION['post_processed']) ? $_SESSION['post_processed'] : false; if ($is_post_redirect && $num_words_generated <= 10) { array_push($_SESSION['chat_history'], $new_question_response); unset($_SESSION['post_processed']); // 重置标记避免重复添加 } // 达10题时添加结束消息(仅添加一次) else if ($num_words_generated > 10 && strpos(implode("", $_SESSION['chat_history']), "You have finished the quiz!") === false) { $end_response = "<div id='output-container'><p>You have finished the quiz!<br>Go back to <a class='button' href='home.php'>home page.</a></p></div>"; array_push($_SESSION['chat_history'], $end_response); } } ?>
2. 修改POST请求处理逻辑
在处理用户提交后添加标记,告知页面加载时需要新增问题:
<?PHP if (isset($_POST['submit']) && $_SERVER["REQUEST_METHOD"] == "POST") { $user_input = $_POST['user_input']; // 添加用户输入到聊天历史 array_push($_SESSION['chat_history'], "<div id='input-container'><p>" . $user_input . "</p></div>"); // 处理用户输入并生成回复 if (strtolower($user_input) == strtolower($lastWord)) { $response = "<div id='output-container'><p>Correct!</p></div>"; $_SESSION['score'] = isset($_SESSION['score']) ? $_SESSION['score'] + 10 : 10; $response .= "<div id='output-container'><p>Score: " . $_SESSION['score'] . "</p></div>"; } else { $response = "<div id='output-container'><p>Incorrect. The correct answer is: " . $lastWord . "</p></div>"; } // 添加系统回复到聊天历史 array_push($_SESSION['chat_history'], $response); // 添加标记,告知页面加载时需新增问题 $_SESSION['post_processed'] = true; // 重定向清空输入 header("Location: " . $_SERVER['REQUEST_URI']); exit(); // 确保重定向生效 } ?>
3. 调整聊天历史展示部分
移除展示逻辑中重复添加$response的代码:
<div id="chat-container"> <?PHP foreach ($_SESSION['chat_history'] as $message) { if (strpos($message, "input-container") !== false) { // 展示用户消息(右侧头像) echo "<div><img src='css/child.png' class='pfp-right'>" . $message . "</div>"; } else { // 展示系统回复(左侧头像) echo "<div><img src='css/koala.png' class='pfp-left'>" . $message . "</div>"; } } ?> </div>
额外说明
- 确保所有使用
$_SESSION的代码前都调用了session_start();,否则会话变量无法正常工作。 - 修复后的逻辑:首次加载添加第一个问题;用户提交答案后,先添加用户输入和系统回复,重定向回来后添加新问题(未达10题时),彻底避免重复显示问题消息的情况。
内容的提问来源于stack exchange,提问作者Erezora Athena
相关产品推荐
相关产品推荐

