You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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代码的几个问题

  1. 数据库连接参数未定义:你直接用了$servername等变量,但没给它们赋值,必须先填上你自己的数据库信息。
  2. JSON解析方式错误:json_decode()默认返回对象,你却用数组的方式访问(比如$data['id']),要么改成对象访问,要么给json_decode()加第二个参数true返回关联数组。
  3. 变量名不匹配:你在PHP里写了$qScore = $data['score'];,但JSON里的键是qScore,这里会导致$qScore为空。
  4. 严重安全问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:38