MySQL插入成功后Ajax无法接收返回信息的问题求助
问题分析与解决方案
核心问题1:表单提交未阻止默认行为
表单触发submit事件后,浏览器会执行默认的页面刷新提交,直接中断Ajax请求,导致无法获取后端返回结果。必须在事件处理中阻止这一默认行为。
核心问题2:前后端数据格式不匹配
前端尝试读取data.message,但后端仅输出"200"或"500"纯字符串,并非JSON对象;同时后端未设置正确响应头,前端也未指定预期数据类型,导致jQuery解析出错。
修复步骤
1. 前端代码修改
<script> $(document).ready(function () { $('#data_form').on("submit", function(e) { e.preventDefault(); // 阻止表单默认刷新提交 var formData = $('#data_form').serialize(); if (!$.active) { $.ajax({ type: 'POST', url: '../../../controller/add_user.php', data: formData, cache: false, dataType: 'json', // 指定预期返回JSON格式 success: function (data) { console.log(data.message); }, error: function(xhr, status, error) { const errData = xhr.responseJSON || {message: error}; console.log(errData.message); } }); } }); }); </script>
2. 后端PHP代码修改
统一返回JSON格式,设置响应头,同时修复SQL注入风险、替换不安全的extract用法:
<?php include_once('../model/database_11.php'); $db_obj = new Dbconnection(); $dbconn = $db_obj->ConnectToDB(); class admin { public $dbconn; public $name; public $account_type; public $telephone = null; public $mobile; public $address; public $pincode; public $email_user; public $gender; public $dob; public $status; public $username; public $password; public function __construct($dbconn, $name, $account_type, $telephone, $mobile, $address, $pincode, $email_user, $gender, $dob, $status, $username, $password) { $this->dbconn = $dbconn; $this->name = $name; $this->account_type = $account_type; $this->telephone = $telephone; $this->mobile = $mobile; $this->address = $address; $this->pincode = $pincode; $this->email_user = $email_user; $this->gender = $gender; $this->dob = date('Y-m-d', strtotime($dob)); $this->status = $status; $this->username = $username; $this->password = $password; } function adduser() { // 用预处理语句防止SQL注入 $stmt = $this->dbconn->prepare("INSERT INTO `users` (`WEB_USERNAME`, `WEB_USERPASSWORD`, `USER_TYPE`, `NAME`, `IMAGE`, `TELEPHONE`, `MOBILE`, `ADDRESS`, `PIN`, `EMAIL`, `GENDER`, `DATE_OF_BIRTH`, `STATUS`) VALUES (?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("sssssssssss", $this->username, $this->password, $this->account_type, $this->name, $this->telephone, $this->mobile, $this->address, $this->pincode, $this->email_user, $this->gender, $this->dob, $this->status ); if ($stmt->execute()) { return ['code' => 200, 'message' => '用户添加成功']; } else { return ['code' => 500, 'message' => '添加失败:' . $stmt->error]; } } public function __destruct() { $this->dbconn->close(); } } // 显式获取POST参数,替代不安全的extract $name = $_POST['name'] ?? ''; $account_type = $_POST['account_type'] ?? ''; $telephone = $_POST['telephone'] ?? null; $mobile = $_POST['mobile'] ?? ''; $address = $_POST['address'] ?? ''; $pincode = $_POST['pincode'] ?? ''; $email_user = $_POST['email_user'] ?? ''; $gender = $_POST['gender'] ?? ''; $dob = $_POST['dob'] ?? ''; $status = $_POST['status'] ?? ''; $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; $admin = new admin($dbconn, $name, $account_type, $telephone, $mobile, $address, $pincode, $email_user, $gender, $dob, $status, $username, $password); $res = $admin->adduser(); // 设置JSON响应头 header('Content-Type: application/json'); echo json_encode($res); ?>
额外优化说明
- 省略SQL中的
ID_USER字段(自增主键),由数据库自动生成,避免冗余代码。 - 预处理语句彻底规避SQL注入风险,是生产环境必备的安全措施。
- 错误返回包含具体错误信息,便于调试定位问题。
内容的提问来源于stack exchange,提问作者Dennis Benny
相关产品推荐
相关产品推荐

