使用AJAX与PHP更新JSON键值失败,寻求问题排查方案
排查PHP+AJAX修改JSON键值无效果的问题
我尝试使用PHP、AJAX和JavaScript修改JSON中的键值并展示结果,但未收到报错却没有预期输出。已修正相等运算符为==,确认JSON解析编码正常,但键值仍未改变,求排查问题原因。
需要修改的JSON数据:
{ "answer01count": "1", "answer02count": "2", "answer03count": "3", "answer04count": "5", "answer05count": "10" }
我的AJAX代码:
ans = $("input[name=answear]:checked").val(); $("#result").click(function(){ $("progress").show(); var x = json.Endokrynologia[val]; if(ans==x.answear01){ count = x.answear01count; } if(ans==x.answer02){ count = x.answer02count; } if(ans==x.answer03){ count = x.answer03count; } if(ans==x.answer04){ count = x.answer04count; } if(ans==x.answer05){ count = x.answer05count; } post_data = { $choice : count }; $.ajax({ method: 'post', data: post_data, url: 'count.php', success: function (data) { result = data; alert(result) } }); });
我的PHP代码:
<?php $count = $_POST['$choice']; $jsonString = file_get_contents('question.json'); $data = json_decode($jsonString, true); if($data[0]['answer01count'] == $count){ $data[0]['answer01count'] = $count+1; } if($data[0]['answer02count'] == $count){ $data[0]['answer02count'] = $count+1; } if($data[0]['answer03count'] == $count){ $data[0]['answer03count'] = $count+1; } if($data[0]['answer04count'] == $count){ $data[0]['answer04count'] = $count+1; } if($data[0]['answer05count'] == $count){ $data[0]['answer05count'] = $count+1; } $newJsonString = json_encode($data); file_put_contents('question.json', $newJsonString); ?>
核心问题分析及修复步骤
1. PHP逻辑错误:错误的判断条件
你的PHP代码是通过比较count的数值来决定修改哪个键,这完全不符合需求:
- 如果多个选项的count值相同(比如
answer01count和answer02count都是1),传过来的count=1会同时修改两个键; - 如果JSON里的count值被修改过,后续传过来的旧count值就匹配不上,导致无法更新。
核心修复思路:让AJAX传递用户选择的选项标识(比如answer01),而不是传递count的数值,PHP根据这个标识直接找到对应的count键加1。
2. AJAX代码的问题及修复
- 变量命名不一致:HTML input的name是
answear,但JS里判断用了x.answear01(多了一个w),导致匹配失败,count变量无法正确赋值; - POST参数逻辑错误:你传递的是旧count值,而非需要修改的目标键名;
- 未处理非选中状态:没有选中选项时
ans会是undefined,后续逻辑直接失效; - 变量作用域问题:
ans定义在点击事件外部,页面加载时就会获取值,此时用户可能还没选择选项。
修复后的AJAX代码:
$("#result").click(function(){ // 移到点击事件内部,确保获取最新选中值 const ans = $("input[name=answear]:checked").val(); if(!ans) { alert("请选择一个选项"); return; } $("progress").show(); const x = json.Endokrynologia[val]; let targetKey = ''; // 修正命名不一致问题,用else if避免不必要的判断 if(ans === x.answer01){ targetKey = 'answer01count'; } else if(ans === x.answer02){ targetKey = 'answer02count'; } else if(ans === x.answer03){ targetKey = 'answer03count'; } else if(ans === x.answer04){ targetKey = 'answer04count'; } else if(ans === x.answer05){ targetKey = 'answer05count'; } // 传递目标键名而非旧count值 const post_data = { target_key: targetKey }; $.ajax({ method: 'POST', data: post_data, url: 'count.php', success: function (data) { alert(data); // 可在此处添加页面更新逻辑 }, error: function(xhr, status, error) { // 增加错误处理,方便排查问题 alert('请求出错: ' + error); } }); });
3. 修复后的PHP代码
<?php // 检查必要参数是否存在 if(!isset($_POST['target_key'])) { echo "缺少必要参数"; exit; } $targetKey = $_POST['target_key']; $jsonPath = 'question.json'; // 检查JSON文件是否存在 if(!file_exists($jsonPath)) { echo "JSON文件不存在"; exit; } $jsonString = file_get_contents($jsonPath); $data = json_decode($jsonString, true); // 检查目标键是否存在,将字符串转为整数后加1(避免字符串拼接) if(isset($data[0][$targetKey])) { $data[0][$targetKey] = (int)$data[0][$targetKey] + 1; // 格式化JSON输出,方便查看 $newJsonString = json_encode($data, JSON_PRETTY_PRINT); if(file_put_contents($jsonPath, $newJsonString)) { echo "更新成功,新值为: " . $data[0][$targetKey]; } else { echo "写入文件失败,请检查文件权限"; } } else { echo "目标键不存在"; } ?>
4. 额外检查点
- JSON结构:你的PHP代码用了
$data[0],说明JSON顶层是数组结构(比如[{"answer01count": "1", ...}]),请确认question.json符合该结构; - 文件权限:确保PHP拥有
question.json的写入权限,否则file_put_contents会失败; - 变量
val的有效性:AJAX里的var x = json.Endokrynologia[val];,请确认val是已定义的有效索引,否则x会是undefined导致判断失效。
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

