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

PHP写入JSON文件时覆盖旧数据,如何实现增量添加?

问题分析与解决方案

让我们一步步拆解你遇到的问题,以及对应的修复方法:

核心问题1:JSON文件格式不匹配

你的原始JSON文件是单个对象格式:

{
  "id": 1,
  "exerciseTitle": "Huisss",
  "exerciseWord": [ "Huisarts" ],
  "syllables": [ "Huis", "arts" ]
}

但你的PHP代码逻辑是把数据当成对象数组来处理(通过$array_data[] = ...新增元素)。当读取单个对象时,json_decode返回的是一个关联数组(而非数组的数组),此时end($array_data)会取到这个对象的最后一个属性值(比如syllables数组),再尝试获取$last_item['id']就会得到null,++null会变成0——这就是你看到"0 null"错误的根源。

修复:把JSON文件改成数组包裹的格式(如果是首次创建文件,代码会自动生成这个格式):

[
    {
        "id": 1,
        "exerciseTitle": "Huisss",
        "exerciseWord": [ "Huisarts" ],
        "syllables": [ "Huis", "arts" ]
    }
]

核心问题2:变量名错误

你定义了$arrExercise存储新数据,但后续写的是$array_data[] = $extra;——$extra是完全未定义的变量,会导致新增的数据为null,破坏JSON结构。

修复:把$extra替换为$arrExercise。

其他遗漏的细节问题

1. 未处理文件不存在的场景

如果是第一次提交表单,JSON文件还未创建,你的代码会跳过逻辑,无法生成初始数组并添加第一个元素。

2. 未检查JSON解码/编码是否成功

如果JSON文件格式损坏,json_decode会返回null;如果新数据包含无法JSON编码的内容,json_encode也会失败,这些情况都需要处理。

3. 初始ID的边界处理

当数组为空(比如刚创建的文件),end($array_data)会返回false,此时需要手动设置初始ID为1。

完整修复后的PHP代码

<?php
if(isset($_POST['submit'])) {
    $jsonFile = 'json_files/database.json';
    $array_data = [];

    // 读取现有数据(如果文件存在)
    if(file_exists($jsonFile)) {
        $current_data = file_get_contents($jsonFile);
        $array_data = json_decode($current_data, true);
        
        // 检查JSON解码是否成功
        if($array_data === null) {
            echo "Error: 数据库JSON格式无效!";
            exit();
        }
    }

    // 计算新ID
    $new_id = 1;
    if(!empty($array_data)) {
        $last_item = end($array_data);
        if(isset($last_item['id'])) {
            $new_id = $last_item['id'] + 1;
        }
    }

    // 组装新数据(建议直接从POST获取,添加空值保护)
    $arrExercise = [
        'id' => $new_id,
        'exerciseTitle' => $_POST['Title'] ?? '',
        'exerciseWord' => $_POST['question_takeAudio_exerciseWord'] ?? [],
        'syllables' => $_POST['Syllables'] ?? []
    ];

    // 添加新数据到数组
    $array_data[] = $arrExercise;

    // 编码为JSON并检查是否成功
    $final_data = json_encode($array_data, JSON_PRETTY_PRINT);
    if($final_data === false) {
        echo "Error: 数据编码为JSON失败!";
        exit();
    }

    // 写入文件并跳转
    if(file_put_contents($jsonFile, $final_data)) {
        header("Location: exercise_CMS.php");
        exit(); // 跳转后必须终止后续代码执行
    } else {
        echo "Oopsie! 保存数据时出错了!";
        exit();
    }
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:24:41