Ajax调用PHP文件时'done'状态无法返回的修复求助
问题分析与修复方案
你的问题主要由两个核心问题导致:
- JavaScript代码未阻止表单默认提交行为,页面刷新会中断Ajax请求,导致无法接收返回结果
- 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
相关产品推荐
相关产品推荐

