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
相关产品推荐
相关产品推荐

