PHP脚本无法接收JavaScript发送的POST数据问题求助
问题根源
你通过POST请求把数据放在了请求体里,但PHP代码却在解析URL的查询字符串(query string)——这两个完全不是同一个数据源,所以$query['param']自然返回undefined。
修复步骤
1. 修改PHP代码获取POST数据
当请求是application/x-www-form-urlencoded类型的POST时,PHP会自动把数据填充到$_POST超全局变量里,直接用这个变量就能拿到参数。另外,原代码存在严重的SQL注入漏洞,必须用预处理语句修复,否则数据库极易被攻击。
修改后的PHP代码:
<?php // 确保OpenCon()正确返回数据库连接 $conn = OpenCon(); // 检查必要参数是否存在,避免未定义索引错误 if (!isset($_POST['name'], $_POST['contact'], $_POST['delivery'], $_POST['value'])) { exit("缺少必要参数"); } // 使用预处理语句防止SQL注入 $sql = "INSERT INTO users (name, contact, delivery, value) VALUES (?, ?, ?, ?)"; $stmt = $conn->prepare($sql); // 绑定参数:s代表字符串类型,可根据字段类型调整(比如i是整数) $stmt->bind_param("ssss", $_POST['name'], $_POST['contact'], $_POST['delivery'], $_POST['value']); // 执行并返回结果 if ($stmt->execute()) { echo "数据插入成功"; } else { echo "插入失败: " . $stmt->error; } // 清理资源 $stmt->close(); $conn->close(); ?>
2. 优化JavaScript代码(可选但推荐)
原JS代码直接拼接参数可能会遇到特殊字符编码问题,且没有处理请求失败的场景,推荐用URLSearchParams自动处理编码,并调整表格更新时机:
function insertNewRecord(data) { // 用URLSearchParams处理表单数据编码 const formData = new URLSearchParams(); formData.append('name', data.name); formData.append('contact', data.contact); formData.append('delivery', data.delivery); formData.append('value', data.value); fetch('/configs/database/add.php', { method: 'POST', body: formData // 无需手动设置Content-Type,URLSearchParams会自动处理 }) .then(response => { if (response.ok) return response.text(); throw new Error('请求失败'); }) .then(message => { console.log(message); // 仅在请求成功后更新表格,避免网络失败但表格已修改的情况 const table = document.getElementById("employeeList").querySelector('tbody'); const newRow = table.insertRow(); newRow.insertCell(0).textContent = data.name; // 用textContent避免XSS newRow.insertCell(1).textContent = data.contact; newRow.insertCell(2).textContent = data.delivery; newRow.insertCell(3).textContent = data.value; newRow.insertCell(4).innerHTML = `<a onClick="onEdit(this)">Edit</a> <a onClick="onDelete(this)">Delete</a>`; }) .catch(error => { console.error(error); alert('数据插入失败,请重试'); }); }
额外注意事项
- 确认
OpenCon()函数返回的是有效的数据库连接实例(如mysqli或PDO) - 非必要场景下用
textContent代替innerHTML,避免XSS攻击 - 所有数据库操作必须用预处理语句,这是防范SQL注入的核心手段
内容的提问来源于stack exchange,提问作者Winchester
相关产品推荐
相关产品推荐

