求助:使用PHP将AJAX数据存入MySQL的代码问题及优化建议
问题修复与完整实现指南
先给你梳理下代码里的几个核心问题,然后直接上修正后的完整代码:
核心问题点
- 参数匹配错误:你JS里AJAX传的是
entry.xxx这类键,但PHP里却试图获取player.GetVar("Slide1"),这完全不对应,根本拿不到数据。 - 过时的数据库扩展:
mysql_*系列函数早就被废弃了,PHP 7+已经彻底移除,必须用mysqli或PDO。 - SQL语法错误:表名
lo-test包含减号,需要用反引号包裹,否则会被当成运算符号。 - SQL注入风险:直接把用户参数拼进SQL里,很容易被注入攻击。
- JS语法错误:你的AJAX代码最后少了闭合的
}和),运行会报错。
修正后的JavaScript代码
我把参数名简化成更清晰的命名,改用POST请求(比GET更安全),补全语法错误并增加了错误回调方便调试:
function Script2() { var player = GetPlayer(); $.ajaxSetup({ cache: false }); $.ajax({ url: "data.php", type: "POST", data: { "username": player.GetVar("username"), "slide1": player.GetVar("Slide1"), "slide2": player.GetVar("slide2"), "slide3": player.GetVar("slide3"), "slide4": player.GetVar("slide4"), "slide5": player.GetVar("Slide5"), "slide6": player.GetVar("slide6") }, dataType: "json", success: function (data) { processData(data); console.log("数据提交成功:", data); }, error: function(xhr, status, error) { console.error("AJAX请求失败:", error); } }); }
修正后的PHP代码(使用mysqli预处理)
这里改用mysqli扩展,用预处理语句防止注入,正确获取POST参数,并且处理了连接和执行错误:
<?php // 调试阶段开启错误提示,上线后可以关闭 error_reporting(E_ALL); ini_set('display_errors', 1); // 只处理POST请求 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 数据库配置 $host = 'localhost'; $dbUser = 'root'; $dbPass = ''; $dbName = 'lo-test'; // 创建mysqli连接 $conn = new mysqli($host, $dbUser, $dbPass, $dbName); // 检查连接是否成功 if ($conn->connect_error) { die(json_encode(['status' => 'error', 'message' => '数据库连接失败: ' . $conn->connect_error])); } // 获取POST参数,用??处理参数不存在的情况 $username = $_POST['username'] ?? ''; $slide1 = $_POST['slide1'] ?? ''; $slide2 = $_POST['slide2'] ?? ''; $slide3 = $_POST['slide3'] ?? ''; $slide4 = $_POST['slide4'] ?? ''; $slide5 = $_POST['slide5'] ?? ''; $slide6 = $_POST['slide6'] ?? ''; // 预处理SQL语句,表名用反引号包裹 $sql = "INSERT INTO `lo-test` (username, slide1, slide2, slide3, slide4, slide5, slide6) VALUES (?, ?, ?, ?, ?, ?, ?)"; $stmt = $conn->prepare($sql); // 绑定参数,"sssssss"表示7个字符串类型参数,根据你的字段类型调整(比如i表示整数) $stmt->bind_param("sssssss", $username, $slide1, $slide2, $slide3, $slide4, $slide5, $slide6); // 执行并返回结果 if ($stmt->execute()) { echo json_encode(['status' => 'success', 'message' => '数据已成功存入数据库']); } else { echo json_encode(['status' => 'error', 'message' => '数据保存失败: ' . $stmt->error]); } // 关闭资源 $stmt->close(); $conn->close(); } else { echo json_encode(['status' => 'error', 'message' => '请使用POST请求提交数据']); } ?>
关键注意事项
- 参数对应:JS里
data对象的键(比如username、slide1)必须和PHP里$_POST获取的键完全一致,这是你之前拿不到数据的核心原因。 - 表结构匹配:确保你的
lo-test表存在username、slide1到slide6这些字段,字段类型要和你存储的数据匹配(比如字符串用VARCHAR,文本用TEXT)。 - 安全问题:上线前记得关闭PHP的错误提示(把
display_errors设为0),避免泄露敏感信息。 - 调试技巧:可以用浏览器的开发者工具(Network标签)查看AJAX请求的参数和响应,快速定位问题。
内容的提问来源于stack exchange,提问作者Mab
相关产品推荐
相关产品推荐

