使用Ajax POST提交星级评分参数ratedIndex无法正常入库问题
问题根因
- 你的提交逻辑拆分了两次独立的POST请求:点击星标时发的AJAX请求仅携带
ratedIndex参数,无评论内容;点击提交按钮触发的表单默认提交仅携带uploadReview参数,表单内没有存放评分的字段,自然拿不到ratedIndex的值。 - AJAX请求设置了
dataType: 'json',但后端处理完请求没有返回符合JSON格式的响应,导致jQuery解析响应失败,不会触发success回调,所以alert不会弹出。 - 后端POST处理逻辑没有做参数存在性校验,无论是星标触发的AJAX请求还是表单提交的请求都会触发INSERT,容易插入大量无效的空数据。
修复方案
1. 调整前端逻辑,评分和评论一起提交
不需要点击星标就发AJAX,把评分值存在表单隐藏域中,随表单一起提交即可:
首先在<form>标签内新增隐藏输入框:
<input type="hidden" name="ratedIndex" id="ratedIndex" value="-1">
然后修改星标点击的JS逻辑,删掉原有的AJAX请求,改为给隐藏域赋值:
$('.fa-star').on('click', function (){ ratedIndex = parseInt($(this).data('index')); // 给隐藏域赋值 $('#ratedIndex').val(ratedIndex); });
2. 后端增加参数校验
修改PHP的POST处理逻辑,确认必要参数都存在再执行插入操作,避免报错:
if ($_SERVER["REQUEST_METHOD"] == "POST"){ require_once 'DBConnect.php'; // 校验所有必要参数是否存在 if(isset($_SESSION["userid"], $_SESSION["username"], $_POST["uploadReview"], $_POST["ratedIndex"], $gameTitle)) { $userid = $_SESSION["userid"]; $game = $gameTitle; $user = $_SESSION["username"]; $review = $_POST["uploadReview"]; $ratedIndex = $_POST["ratedIndex"]; $stmt = $conn->prepare("INSERT INTO reviews(game, user, userid, review, indexStar) VALUES (?,?,?,?,?)"); $stmt->bind_param("sssss",$game, $user, $userid, $review, $ratedIndex); $stmt->execute(); // 插入成功后可以加跳转或者提示逻辑 } }
可选:保留AJAX提交的修复方法
如果你想要用AJAX提交整个表单,不需要表单默认提交,可以阻止按钮的默认提交行为,把评论内容和评分一起放在AJAX的data里发送,同时去掉dataType: 'json'或者后端返回合法JSON即可。
内容的提问来源于stack exchange,提问作者Darke
相关产品推荐
相关产品推荐

