使用JSON、XMLHttpRequest与PHP的file_get_contents无法填充数据库求助
帮你解决JSON数据无法存入MySQL的问题
嘿,别慌!我帮你揪出了代码里几个关键问题,咱们一步步搞定:
一、HTML脚本的核心错误
你手动拼接JSON字符串的方式完全不对——不仅格式有语法错误(比如usersName前面少了一个双引号),而且变量根本不会被替换成实际值,最后生成的是无效的JSON,PHP自然解析不了。
正确的做法是先创建一个JavaScript对象,再用JSON.stringify()把它转成合法的JSON字符串。另外,建议加上请求的响应监听,方便你调试看哪里出问题。
修正后的HTML脚本:
<script> // 先创建包含所有数据的JavaScript对象 var jsonQuizData = { id: '9', usersName: 'Bart Bundy', usersEmail: 'bbundy@blue.com', quizTitle: 'SomeQuiz99', qScore: '33%', Output1: 'Some blob data goes in here?' }; // 把对象转成合法的JSON字符串 var dbString = JSON.stringify(jsonQuizData); var request = new XMLHttpRequest(); request.open("POST", "process.php", true); request.setRequestHeader("Content-Type", "application/json"); // 添加响应处理,方便调试看结果 request.onload = function() { if (request.status >= 200 && request.status < 400) { console.log("服务器返回:", request.responseText); } else { console.error("请求出错,状态码:", request.status); } }; // 监听网络错误 request.onerror = function() { console.error("网络请求失败,请检查process.php路径是否正确"); }; request.send(dbString); </script>
二、PHP代码的几个问题
- 数据库连接参数未定义:你直接用了
$servername等变量,但没给它们赋值,必须先填上你自己的数据库信息。 - JSON解析方式错误:
json_decode()默认返回对象,你却用数组的方式访问(比如$data['id']),要么改成对象访问,要么给json_decode()加第二个参数true返回关联数组。 - 变量名不匹配:你在PHP里写了
$qScore = $data['score'];,但JSON里的键是qScore,这里会导致$qScore为空。 - 严重安全问题:SQL注入:直接把用户数据拼进SQL语句里非常危险,必须用预处理语句。
修正后的process.php:
<?php // 开启错误显示(调试用,上线后可以关掉) error_reporting(E_ALL); ini_set('display_errors', 1); header("Content-Type: application/json; charset=UTF-8"); // 替换成你自己的数据库连接信息 $servername = "localhost"; $username = "你的数据库用户名"; $password = "你的数据库密码"; $dbname = "你的数据库名"; // 创建并检查数据库连接 $conn = mysqli_connect($servername, $username, $password, $dbname); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 获取POST的JSON数据,转为关联数组 $data = json_decode(file_get_contents("php://input"), true); // 检查JSON是否解析成功 if (!$data) { die('Error: 无法解析传入的JSON数据'); } // 提取数据(键名要和JSON里的完全一致) $id = $data['id']; $name = $data['usersName']; $email = $data['usersEmail']; $qtitle = $data['quizTitle']; $result1 = $data['Output1']; $qScore = $data['qScore']; // 修正了之前的键名错误 // 使用预处理语句防止SQL注入(必须这么做!) $stmt = mysqli_prepare($conn, "INSERT INTO quiz01(quiz_id, quiz_title, fName, eMail, quiz_score, q1_answer) VALUES(?, ?, ?, ?, ?, ?)"); // 绑定参数,"ssssss"表示6个字符串类型的参数 mysqli_stmt_bind_param($stmt, "ssssss", $id, $qtitle, $name, $email, $qScore, $result1); // 执行插入 if (mysqli_stmt_execute($stmt)) { echo "Data inserted successfully"; } else { die('Error : ' . mysqli_stmt_error($stmt)); } // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
三、新手调试小技巧
- 打开浏览器开发者工具(按F12),切换到Network标签,找到你的POST请求,查看请求的状态码、发送的数据和服务器返回的内容,这能帮你快速定位问题。
- 确保
process.php和HTML页面在同一个目录,或者用正确的相对路径(比如/path/to/process.php)。 - 检查数据库表
quiz01的字段名和你插入的字段是否完全匹配,比如quiz_score和你PHP里的$qScore对应,别写错字段名。
内容的提问来源于stack exchange,提问作者Stonker Baksteen
相关产品推荐
相关产品推荐

