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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:41