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

使用AJAX提交回复后出现重复回复的问题求助

评论回复重复显示问题的解决方案

你的问题核心出在前端事件绑定的嵌套逻辑上:每次点击.reply-btn时,都会为.submit-reply元素重复绑定一次点击事件。第一次点击回复按钮时绑定1次事件,第二次点击时再叠加绑定1次,此时点击提交回复会触发2次AJAX请求,导致回复重复显示;刷新页面后事件绑定被重置,所以暂时恢复正常。

修复后的前端代码

将提交回复的事件绑定从回复按钮的事件处理函数中移出,改为独立的事件委托,同时调整评论ID的获取方式:

$(document).ready(function () {
    // 提交主评论逻辑(保持不变)
    $(document).on('click', '#submit_comment', function (e) {
        e.preventDefault();
        var comment_text = $('#comment_text').val();
        var url = $('#comment_form').attr('action');
        if (comment_text === "") return;
        $.ajax({
            url: url,
            type: "POST",
            data: {
                comment_text: comment_text,
                comment_posted: 1
            },
            success: function (data) {
                var response = JSON.parse(data);
                if (data === "error") {
                    alert('添加评论时出错,请重试');
                } else {
                    $('#comments-wrapper').prepend(response.comment)
                    $('#comments_count').text(response.comments_count);
                    $('#comment_text').val('');
                }
            }
        });
    });

    // 切换回复表单显示/隐藏
    $(document).on('click', '.reply-btn', function (e) {
        e.preventDefault();
        var comment_id = $(this).data('id');
        $(this).parent().siblings('form#comment_reply_form_' + comment_id).toggle(500);
    });

    // 提交回复逻辑(独立绑定,避免重复绑定)
    $(document).on('click', '.submit-reply', function (e) {
        e.preventDefault();
        var $form = $(this).parent();
        // 从表单的data属性获取对应评论ID
        var comment_id = $form.data('comment-id');
        var reply_textarea = $form.find('textarea');
        var reply_text = reply_textarea.val();
        var url = $form.attr('action');

        if (reply_text === "") return;

        $.ajax({
            url: url,
            type: "POST",
            data: {
                comment_id: comment_id,
                reply_text: reply_text,
                reply_posted: 1
            },
            success: function (data) {
                if (data === "error") {
                    alert('添加回复时出错,请重试');
                } else {
                    $('.replies_wrapper_' + comment_id).append(data);
                    reply_textarea.val('');
                }
            }
        });
    });
});

配合HTML修改

需要给回复表单添加data-comment-id属性,值为对应评论的ID,示例:

<form id="comment_reply_form_123" action="你的处理地址" data-comment-id="123">
    <textarea placeholder="输入你的回复..."></textarea>
    <button class="submit-reply">提交回复</button>
</form>

后端代码优化(可选但推荐)

原后端存在SQL注入风险,建议改用预处理语句修复:

if (isset($_POST['reply_posted'])) {
    global $conn;
    $reply_text = $_POST['reply_text']; 
    $comment_id = $_POST['comment_id']; 

    // 使用预处理语句防止SQL注入
    $sql = "INSERT INTO replies (user_id, comment_id, body, created_at, updated_at) VALUES (?, ?, ?, now(), null)";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "iis", $user_id, $comment_id, $reply_text);
    $result = mysqli_stmt_execute($stmt);

    if ($result) {
        $inserted_id = mysqli_stmt_insert_id($stmt);
        $res = mysqli_query($conn, "SELECT * FROM replies WHERE id=$inserted_id");
        $inserted_reply = mysqli_fetch_assoc($res);

        $reply = "<div class='comment reply clearfix'>
                        <img src='profile.png' alt='' class='profile_pic'>
                        <div class='comment-details'>
                                <span class='comment-name'>" . getUsernameById($inserted_reply['user_id']) . "</span>
                                <span class='comment-date'>" . date('F j, Y ', strtotime($inserted_reply['created_at'])) . "</span>
                                <p>" . $inserted_reply['body'] . "</p>
                                <a class='reply-btn' href='#' data-id='" . $inserted_reply['id'] . "'>reply</a>
                        </div>
                </div>";
        echo $reply;
        exit();
    } else {
        echo "error";
        exit();
    }
}

内容的提问来源于stack exchange,提问作者Razvan B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:27