You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP单词解谜程序$response重复显示问题求助

问题修复方案

核心问题分析

你的代码存在两个关键问题导致$response重复显示:

  1. 页面每次加载都重复添加问题消息到聊天历史:页面初始化阶段的顶部PHP代码会生成$response并直接推入$_SESSION['chat_history'],包括用户提交答案后重定向回来的加载,这就导致每次刷新都会新增一条问题消息,和之前的回复重复。
  2. 计数器赋值错误:$_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:52