PHP如何访问JSON结构中的嵌套数组time_array?
正确访问JSON嵌套数组的PHP方法
我来帮你排查问题——你的代码里有两个关键错误导致无法正确读取time_array的元素,还有一个需要重视的安全风险,下面一步步拆解并修正:
问题根源分析
重复解码JSON:
你第一次调用json_decode($requestBody, TRUE)时,第二个参数TRUE已经把整个JSON字符串转换成了PHP关联数组。这意味着$requestBody['time_array']本身就是一个合法的PHP数组,不需要再用json_decode($time_array, True)二次解码——这会让$json_array变成null或者无效值,自然遍历不出内容。错误的元素访问方式:
因为你用了json_decode(..., TRUE)转成了关联数组,所以不能用对象的->语法访问元素,必须用数组下标['key']的方式。SQL注入风险:
你的INSERT语句直接把变量拼接进SQL字符串,这是非常危险的做法,很容易被攻击者利用进行SQL注入攻击,必须改用预处理语句。
修正后的完整代码
// 获取请求体并解码为关联数组 $requestBody = file_get_contents('php://input'); $requestData = json_decode($requestBody, TRUE); // 直接获取嵌套的time_array数组(无需二次解码) $timeArray = $requestData['time_array']; // 从请求数据中获取provider_id(假设你之前的$provider_id来自这里) $providerId = $requestData['provider_id']; // 示例日期和状态,根据你的实际逻辑调整 $currentDate = date('Y-m-d'); $status = 'active'; // 遍历time_array中的每一项 foreach ($timeArray as $timeItem) { $day = $timeItem['day']; $startTime = $timeItem['start_time']; $endTime = $timeItem['end_time']; // 使用mysqli预处理语句防止SQL注入 $stmt = mysqli_prepare($con, "INSERT INTO `nesbaty_working_time` (`provider_id`, `day`, `opening_time`, `closing_time`, `time`, `status`) VALUES (?, ?, ?, ?, ?, ?)"); // 绑定参数,"ssssss"表示6个字符串类型的参数 mysqli_stmt_bind_param($stmt, "ssssss", $providerId, $day, $startTime, $endTime, $currentDate, $status); mysqli_stmt_execute($stmt); mysqli_stmt_close($stmt); }
可选:用对象方式访问JSON数据
如果你更习惯用对象的->语法访问元素,可以去掉json_decode的第二个参数TRUE,此时整个JSON会被转成PHP对象,代码调整如下:
$requestBody = file_get_contents('php://input'); // 解码为PHP对象(无第二个参数) $requestData = json_decode($requestBody); $timeArray = $requestData->time_array; $providerId = $requestData->provider_id; foreach ($timeArray as $timeItem) { $day = $timeItem->day; $startTime = $timeItem->start_time; $endTime = $timeItem->end_time; // 预处理语句部分和上面一致 }
两种方式都能正常工作,选你觉得顺手的风格就好,但一定要保持统一——不要混合使用数组下标和对象属性的访问方式。
内容的提问来源于stack exchange,提问作者Jayvirsinh Vaghela
相关产品推荐
相关产品推荐

