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

AJAX传递FormData时PHP无法识别 导致MySQL字段不能为空错误如何解决

问题原因

  • AJAX传递FormData的格式错误:你把已经实例化的FormData对象又包裹在了一层{}对象里,相当于请求体里只有一个名为thumbnail的参数,PHP端自然拿不到QuizTitle等独立字段。
  • 重复提交逻辑错误:你向同一个PHP接口发起了两次独立的AJAX请求,第一次只传表单整体但没有单独处理Genre(其实表单里已经包含Genre字段),第二次只传Genre但没有其他表单字段,两次请求都会因为字段不全触发数据库字段非空报错。
  • 未处理表单字段默认值:未勾选的复选框不会被FormData主动提交,直接读取$_POST['对应字段']会返回NULL,需要加默认值判断。
  • PHP端缺少文件读取逻辑:你的代码里$imageQuizThumbnail变量没有从$_FILES['QuizThumbnail']中读取上传的文件内容,插入数据库时也会为空。

修正方案

1. 修正AJAX代码

var tnv = document.getElementById("thumbnail");
var thumbnail = new FormData(tnv);
// 直接传递FormData对象,不要包裹在对象中
$.ajax({
    type: "POST",
    url: "jhyric7b34yub57iybiuyur3u85iofh8.php",
    data: thumbnail, // 去掉外层大括号,直接传FormData实例即可
    cache: false,
    contentType: false,
    processData: false
}).done(function(Created) {
    alert(Created);
}).fail(function(xhr, textStatus, errorThrown){
    alert("Woah");
});
// 删除第二个单独传Genre的AJAX请求,FormData已经包含了表单内的Genre字段

2. 修正PHP代码

先处理上传的图片,再给所有可选字段加默认值:

// 处理上传的缩略图
$imageQuizThumbnail = file_get_contents($_FILES['QuizThumbnail']['tmp_name']);
// 给所有可能为空的字段加默认值,避免直接读$_POST返回NULL
$QuizTitle = $_POST['QuizTitle'] ?? '';
$QuizDescription = $_POST['QuizDescription'] ?? '';
$Genre = $_POST['Genre'] ?? '';
$OneByOne = isset($_POST['OneByOne']) ? 1 : 0;
$Public = isset($_POST['Public']) ? 1 : 0;
$PremiumQuiz = isset($_POST['PremiumQuiz']) ? 1 : 0;
$QuizBundler = $_POST['QuizBundler'] ?? 'No';
$ScrambleOptions = isset($_POST['ScrambleOptions']) ? 1 : 0;
$ScrambleQuestions = isset($_POST['ScrambleQuestions']) ? 1 : 0;
$FontSize = $_POST['FontSize'] ?? 16;

$bytes = random_bytes(25);
$sql  = "
INSERT INTO Quizzes
    (QuizMaker, DateCreated, Rating, RatingComments, AverageScore, Difficulty, AverageTimeTaken, Views, Likes, Dislikes, LikesToDislikePercentage, QuizTitle, QuizDescription, QuizThumbnail, OneByOne, Public, PremiumQuiz, QuizBundler, ScrambleOptions, ScrambleQuestions, FontSize, QuizTrackingId)
VALUES
    (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
";
$query = mysqli_prepare($link, $sql);
// 绑定参数时使用上面预处理过的变量
mysqli_stmt_bind_param($query, "ssisiiiiiiissbssssssis", $_SESSION['usernameId'], $dateTimeVariable, $na, $na, $na, $na, $na, $na, $na, $na, $na, $QuizTitle, $QuizDescription, $imageQuizThumbnail, $OneByOne, $Public, $PremiumQuiz, $QuizBundler, $ScrambleOptions, $ScrambleQuestions, $FontSize, $bytes);
mysqli_stmt_execute($query);
$result = mysqli_stmt_get_result($query);

$sql0 = "INSERT INTO Genre (Genre, QuizTrackingId) VALUES (?, ?)";
$query0 = mysqli_prepare($link, $sql0);
mysqli_stmt_bind_param($query0, "ss", $Genre, $bytes);
mysqli_stmt_execute($query0);
$result0 = mysqli_stmt_get_result($query0);

内容的提问来源于stack exchange,提问作者Pal Dhillon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:00