PHP如何解析JSON数据并将其写入MySQL数据库?
解析JSON并插入MySQL的正确方法
我来帮你一步步排查代码问题并给出完整的解决方案,你的需求是把前端发送的JSON数据解析后,将子分类ID批量插入MySQL数据库,咱们先看原代码里的几个关键错误:
原代码的问题点
- 变量名混淆:你把解析后的JSON数据存在
$reps_list变量里,但循环时却用了未定义的$array,导致无法读取数据 - 循环边界错误:使用
$i <= count(...)会导致数组越界,比如数组有3个元素(索引0、1、2),count返回3,循环会执行到$i=3,而数组没有这个索引,直接报错 - 语法错误:数组索引
[i]缺少$符号,正确写法是[$i] - SQL注入风险:直接把变量拼接进SQL语句,这是非常危险的做法,容易被恶意攻击
- 可能的JSON接收方式错误:如果前端是直接发送raw JSON请求体,而非将JSON字符串放在表单字段中,
$_POST['reps_list']是无法获取到数据的
正确的实现步骤及代码
第一步:正确接收JSON数据
首先要根据前端的发送方式选择对应的接收方法:
// 情况1:前端通过表单的reps_list字段传递JSON字符串 if (isset($_POST['reps_list'])) { $json_content = $_POST['reps_list']; } else { // 情况2:前端发送的是raw JSON请求体(更常见的JSON发送方式) $json_content = file_get_contents('php://input'); }
第二步:解析并验证JSON数据
解析后要检查是否解析成功,同时验证数据结构是否符合预期:
// 解析JSON为关联数组 $parsed_data = json_decode($json_content, true); // 检查解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析失败:' . json_last_error_msg()); } // 验证是否存在需要的字段且为数组 if (!isset($parsed_data['reps_list']['selected_subcategory_id']) || !is_array($parsed_data['reps_list']['selected_subcategory_id'])) { die('数据格式错误:缺少有效的selected_subcategory_id数组'); } // 提取需要的子分类ID数组 $subcategory_ids = $parsed_data['reps_list']['selected_subcategory_id'];
第三步:用预处理语句批量插入数据
使用MySQLi预处理语句可以避免SQL注入,同时提升批量插入的效率:
// 假设你的reps表结构包含id(自增)和subcategory_id字段 // 创建预处理语句 $stmt = mysqli_prepare($conn, "INSERT INTO reps (subcategory_id) VALUES (?)"); if (!$stmt) { die('预处理语句创建失败:' . mysqli_error($conn)); } // 绑定参数:"i"表示参数为整型 mysqli_stmt_bind_param($stmt, "i", $current_id); // 循环插入每个ID $insert_count = 0; foreach ($subcategory_ids as $current_id) { // 可选:验证ID是否为有效整数,过滤无效数据 if (!is_int($current_id) || $current_id < 0) { continue; } // 执行插入 if (mysqli_stmt_execute($stmt)) { $insert_count++; } } // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn); echo "数据插入完成,成功插入{$insert_count}条有效记录";
额外注意事项
- 确保你的MySQL连接
$conn已经正确建立(比如通过mysqli_connect()) - 如果reps表有其他必填字段,需要在INSERT语句中补充对应的字段和参数
- 建议添加错误处理逻辑,比如捕获插入失败的情况并记录日志
内容的提问来源于stack exchange,提问作者Giorgi Asaturyan
相关产品推荐
相关产品推荐

