PHP接收HTML表单数据写入JSON文件失败问题求助
PHP写入JSON文件失败修复方案
核心错误点
- 路径格式错误:
file_exists、file_put_contents等文件操作函数的参数中错误添加了Location:前缀,该前缀仅用于HTTP跳转响应,不能作为本地文件路径使用 - 逻辑遗漏:文件存在时未读取原有JSON内容并解析为数组,直接对未初始化的
$bookingJson执行追加操作,会导致原有数据丢失,同时触发PHP未定义变量警告 - 路径层级错误:index.php存放在根目录,assets为同级目录,不需要使用
../返回上一级,错误的层级会导致系统找不到目标文件 - 文件名拼写不一致:代码中引用的文件名为
bookings.json,实际assets目录下的文件名为booking.json,名称不匹配会导致文件操作失败 - 边界校验缺失:未对POST参数是否存在、JSON解析/编码结果、文件写入权限做校验,无法定位具体故障点
修复后代码
变量定义部分
// 增加参数存在校验,避免未传参时抛出PHP警告 $name = isset($_POST['name']) ? trim($_POST['name']) : ''; $surname = isset($_POST['surname']) ? trim($_POST['surname']) : ''; $email = isset($_POST['email']) ? trim($_POST['email']) : ''; $checkIn = isset($_POST['checkIn']) ? trim($_POST['checkIn']) : ''; $checkOut = isset($_POST['checkOut']) ? trim($_POST['checkOut']) : ''; $hotel = isset($_POST['hotel']) ? trim($_POST['hotel']) : '';
写入逻辑部分
// 定义统一的文件路径,避免重复写错 $jsonFile = './assets/booking.json'; if (!empty($name)) { $bookingJson = []; // 文件存在时先读取原有内容 if (file_exists($jsonFile)) { $existingContent = file_get_contents($jsonFile); $bookingJson = json_decode($existingContent, true) ?: []; } // 追加新的预订数据 $bookingJson[] = [ "name" => $name, "surname" => $surname, "email" => $email, "checkIn" => $checkIn, "checkOut" => $checkOut, "hotel" => $hotel ]; // 写入文件,加判断确认写入结果 $writeResult = file_put_contents($jsonFile, json_encode($bookingJson, JSON_PRETTY_PRINT)); if ($writeResult === false) { echo "文件写入失败,请检查assets目录权限"; } else { echo "预订信息提交成功"; } }
额外注意事项
- 确认assets目录拥有可读可写权限,Linux环境下可执行
chmod 755 assets设置目录权限,booking.json文件权限设置为chmod 644 booking.json - 确认HTML表单的提交方式为
method="POST",所有表单项的name属性和$_POST中读取的键名完全一致,无拼写错误
内容的提问来源于stack exchange,提问作者Brendon
相关产品推荐
相关产品推荐

