PHP无法接收jQuery Ajax传递的数据,数据库无数据写入
问题分析与解决方案
我帮你排查了几个关键问题,这些都是导致数据无法传递到PHP并写入数据库的核心原因:
1. jQuery选择器匹配错误
你的<select>标签id是id_category,但jQuery代码里用了$("#category"),这会找不到目标元素,导致category2的值为undefined,无法正常传递。
2. 未阻止表单默认提交行为
点击提交按钮时,浏览器会触发表单的默认刷新提交动作,这会直接中断Ajax异步请求,导致数据还没发送到PHP就跳转页面了。
3. SQL语法错误(字符串未加引号)
你的SQL插入语句中,email和category是字符串类型,但没有用单引号包裹,这会触发SQL语法错误,数据库根本无法执行插入操作。另外直接拼接变量还存在严重的SQL注入风险,必须改用预处理语句。
4. jQuery语法细节错误
- 引入jQuery的
<script>标签不能同时写业务代码,必须拆分成两个独立标签; - Ajax的
success函数结尾多了一个多余的分号,导致语法报错。
5. PHP响应方式不合理
Ajax是异步请求,不需要用header("Location: index.php")跳转页面,应该返回JSON格式的响应,让前端明确知道操作结果。
修正后的完整代码
HTML代码(无需修改)
<form class="form-inline" method="post" > <div id="div_id_value" class="form-group"> <input class="numberinput form-control" id="value" name="value" placeholder="Value (mmol/L)" required="True" type="number" step="any" min="0"/> </div> <div id="div_id_category" class="form-group"> <select id="id_category" name="category"> <option value="Breakfast">Breakfast</option> <option value="Lunch" >Lunch</option> <option value="Dinner">Dinner</option> <option value="Snack">Snack</option> <option value="Bedtime">Bedtime</option> <option value="No Category" selected="selected">No Category</option> </select> </div> <input type="submit" name="submit" value="Quick Add" id="quick"> </form>
jQuery代码(修正后)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> $("#quick").click(function(e) { // 阻止表单默认刷新提交行为 e.preventDefault(); var sugar2 = $("#value").val(); // 修正选择器,匹配select的真实id var category2 = $("#id_category").val(); $.ajax({ type:'POST', url:'quick.php', data:{ 'sugar': sugar2, 'category': category2 }, dataType:'json', success: function(output) { alert(output.message); // 成功后清空输入框提升体验 $("#value").val(''); }, error: function(xhr, status, error) { // 新增错误捕获,方便调试 alert("请求出错: " + error); } }); }); </script>
PHP代码(修正后,防SQL注入)
<?php session_start(); include 'conn.php'; // 初始化响应数据结构 $response = ['success' => false, 'message' => '操作失败']; // 验证请求类型与参数完整性 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sugar'], $_POST['category'], $_SESSION['email'])) { $sugar = $_POST['sugar']; $category = $_POST['category']; $email = $_SESSION['email']; // 使用预处理语句,彻底避免SQL注入风险 $query = "INSERT INTO data (email, sugar, category) VALUES(?, ?, ?)"; $stmt = mysqli_prepare($link, $query); // 绑定参数:s=字符串,d=数字,对应email/sugar/category的类型 mysqli_stmt_bind_param($stmt, "sds", $email, $sugar, $category); if(mysqli_stmt_execute($stmt)) { $response['success'] = true; $response['message'] = '数据添加成功!'; } else { $response['message'] = '数据库错误: ' . mysqli_error($link); } mysqli_stmt_close($stmt); } // 返回JSON格式响应 header('Content-Type: application/json'); echo json_encode($response); ?>
调试小技巧
- 打开浏览器开发者工具(F12),切换到Network标签,点击提交按钮后查看Ajax请求的状态码和响应内容,能快速定位问题;
- 检查
conn.php的数据库连接是否正常,确保数据库用户拥有data表的插入权限; - 确认
data表的字段类型匹配:email和category应为字符串类型(如VARCHAR),sugar应为数值类型(如FLOAT/DECIMAL)。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

