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

Ajax调用PHP文件时'done'状态无法返回的修复求助

问题分析与修复方案

你的问题主要由两个核心问题导致:

  1. JavaScript代码未阻止表单默认提交行为,页面刷新会中断Ajax请求,导致无法接收返回结果
  2. PHP中对INSERT预处理语句错误调用mysqli_free_result(),触发脚本错误,无法正常输出JSON

修复步骤

1. 修正JavaScript代码(阻止默认提交)

表单提交时浏览器会执行默认的页面跳转/刷新,这会直接中断Ajax请求,导致你看不到done状态的提示。需要在提交事件中添加e.preventDefault()阻止默认行为,同时增加错误回调方便排查问题:

$(document).ready(function(){
   $("#form").submit(function(e){
     // 阻止表单默认提交,避免页面刷新
     e.preventDefault();
     $.ajax({
       url: "file.php",
       type: "POST",
       dataType: "json",
       data: $('#form').serialize(),
       success: function(data){
         alert(data.status);
       },
       // 新增错误回调,查看请求失败时的响应内容
       error: function(xhr){
         console.log("请求响应内容:", xhr.responseText);
       }
     })
   })
 })

2. 修正PHP代码(移除错误操作+优化预处理逻辑)

  • mysqli_free_result()仅用于释放SELECT类查询的结果集,INSERT操作没有结果集,调用它会触发PHP错误,中断脚本执行,导致echo json_encode($data)无法正常输出
  • 原预处理语句写法没有发挥参数绑定的安全作用,改成参数绑定更能避免SQL注入
  • 改用$_SERVER['REQUEST_METHOD'] === 'POST'判断请求,避免因提交按钮无name="submit"属性导致代码不执行的问题

修复后的PHP代码:

<?php
session_start();
// 用请求方法判断更可靠,无需依赖submit参数
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    include 'config.php';
    $data = array();
    
    $name = $_POST['username'];
    $mail = $_POST['mail'];
    $psw = $_POST['password'];
    $code = uniqid();

    // 检查邮箱是否已存在
    $qry = $conn->query("SELECT * FROM member WHERE mail='{$conn->real_escape_string($mail)}'");
    if (mysqli_num_rows($qry) > 0) {
        $data["status"] = "undone";
    } else {
        // 改用参数绑定的预处理语句,提升安全性
        $qry2 = $conn->prepare("INSERT INTO member (name, mail, psw, code) VALUES (?, ?, ?, ?)");
        // 绑定参数,ssss表示四个字符串类型参数
        $qry2->bind_param("ssss", $name, $mail, $psw, $code);
        
        if ($qry2->execute()) {
            $_SESSION['SESSION_MAILADDRESS'] = $mail;
            $data["status"] = "done";
        } else {
            $data["status"] = "error";
        }
        // 关闭预处理语句
        $qry2->close();
    }
    
    // 输出JSON结果
    echo json_encode($data);
    // 释放查询结果集
    mysqli_free_result($qry);
    $conn->close();
}
?>

额外排查点

  • 打开浏览器控制台(F12)的Network标签,查看Ajax请求的响应内容,确认PHP是否正常输出了{"status":"done"}
  • 确保config.php的数据库连接正常,且member表的字段与INSERT语句中的字段完全匹配
  • 如果表单提交按钮没有设置name="submit",原PHP中的isset($_POST['submit'])会判断失败,导致代码块不执行,改用请求方法判断可避免此问题

内容的提问来源于stack exchange,提问作者sedric alonso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:15:41