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

PHP数组报错:Trying to get property of non-object 求助

解决JSON解码为PHP数组后" Trying to get property of non-object "报错问题

我一眼就看出问题所在了——你在解码JSON的时候犯了一个典型的“数组/对象混淆”错误,具体原因和解决方法如下:

报错原因

你调用json_decode($_POST['time_array'], true)时传入了第二个参数true,这个参数的作用是让PHP把JSON字符串解码成关联数组,而不是对象。但后面的循环里,你却用了对象的属性访问符->(比如$json_array->day)去访问数组元素,这就导致PHP报错:你试图从一个非对象(数组)里获取对象属性,自然会触发这个错误。

另外,你的循环逻辑还有个小问题:你用for循环遍历数组,但始终没有取出数组里的单个元素(比如$json_array[$i]),而是直接操作整个数组$json_array,这也会导致你无法获取到每个元素的day、start_time等值。

解决方法

有两种修正方案,你可以根据自己的习惯选择:

方案1:保持数组模式(推荐)

既然你已经指定了解码为数组,那就用数组的下标访问方式,同时改用foreach循环遍历每个元素(比for更简洁安全):

$json_array = json_decode($_POST['time_array'], true);

// 先检查解码是否成功,避免JSON格式错误导致后续报错
if (is_array($json_array)) {
    foreach ($json_array as $item) {
        $day = $item['day'];
        $start_time = $item['start_time'];
        $end_time = $item['end_time'];
        
        // 重要提醒:改用预处理语句防止SQL注入,别直接拼接变量!
        $insert_sql = "INSERT INTO `nesbaty_working_time` 
                       (`provider_id`, `day`, `opening_time`, `closing_time`, `time`, `status`) 
                       VALUES (?, ?, ?, ?, ?, ?)";
        
        $stmt = mysqli_prepare($con, $insert_sql);
        mysqli_stmt_bind_param($stmt, "isssss", $provider_id, $day, $start_time, $end_time, $date, $status);
        mysqli_stmt_execute($stmt);
    }
}

方案2:改为对象模式

如果你更喜欢用对象的->访问方式,只需要去掉json_decode的第二个参数true,让它返回对象即可:

$json_array = json_decode($_POST['time_array']); // 去掉第二个参数true

// 同样先检查解码结果
if (is_array($json_array)) {
    foreach ($json_array as $item) {
        $day = $item->day;
        $start_time = $item->start_time;
        $end_time = $item->end_time;
        
        // 同样推荐使用预处理语句
        $insert_sql = "INSERT INTO `nesbaty_working_time` 
                       (`provider_id`, `day`, `opening_time`, `closing_time`, `time`, `status`) 
                       VALUES (?, ?, ?, ?, ?, ?)";
        
        $stmt = mysqli_prepare($con, $insert_sql);
        mysqli_stmt_bind_param($stmt, "isssss", $provider_id, $day, $start_time, $end_time, $date, $status);
        mysqli_stmt_execute($stmt);
    }
}

额外注意事项

  • 一定要添加is_array($json_array)的判断:如果JSON格式错误,json_decode会返回null,这时候直接循环会引发新的错误。
  • 绝对不要直接拼接用户输入到SQL语句中:你原来的代码用'".$provider_id."'这种方式拼接变量,存在严重的SQL注入风险,预处理语句才是安全的做法。
  • foreach循环比for更适合遍历这种不确定长度的数组,不需要手动维护索引,不容易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:31