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

PHP代码运行报错:尝试获取非对象的'data'属性,请求协助

解决PHP中Trying to get property 'data' of non-object及foreach无效参数问题

用户代码尝试远程获取JSON数据并解析遍历,但出现以下报错:

Notice: Trying to get property 'data' of non-object in /storage/ssd4/665/18079665/public_html/OurGrocery/TESTING_FOLDER/testing.php on line 28
Warning: Invalid argument supplied for foreach() in /storage/ssd4/665/18079665/public_html/OurGrocery/TESTING_FOLDER/testing.php on line 28

虽然手动验证JSON内容有效,但代码执行时$json并非预期对象,核心原因是远程请求失败或JSON解码失败,以下是具体排查和修复方案:

1. 排查file_get_contents远程请求是否成功

很多服务器默认禁用allow_url_fopen,或存在网络/跨域限制,导致file_get_contents无法获取远程内容,返回false。先添加请求结果检查:

$path_to_file = 'https://kamboz.000webhostapp.com/OurGrocery/OurItemsGet/all_items.php';
$file_contents = file_get_contents($path_to_file);

// 检查请求是否成功
if ($file_contents === false) {
    die('无法获取远程文件内容,请检查allow_url_fopen设置或网络连接');
}

2. 捕获JSON解码错误

即使JSON内容有效,解码过程也可能因编码问题、特殊字符等失败,返回null。添加解码错误检查:

$json = json_decode($file_contents);

// 检查JSON解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    die('JSON解码失败:' . json_last_error_msg());
}

3. 验证data属性存在且为可遍历类型

确保解码后的对象包含data属性,并且是数组或可遍历对象:

// 验证data属性存在且是数组/对象
if (isset($json->data) && is_iterable($json->data)) {
    foreach ($json->data as $item) {
        echo $item->id . '<br>';
    }
} else {
    die('JSON结构中不存在可遍历的data属性');
}

完整修复后的代码

<?php
$path_to_file = 'https://kamboz.000webhostapp.com/OurGrocery/OurItemsGet/all_items.php';
$file_contents = file_get_contents($path_to_file);

// 检查远程请求结果
if ($file_contents === false) {
    die('无法获取远程文件内容,请检查allow_url_fopen设置或网络连接');
}

$json = json_decode($file_contents);

// 检查JSON解码状态
if (json_last_error() !== JSON_ERROR_NONE) {
    die('JSON解码失败:' . json_last_error_msg());
}

// 验证data属性并遍历
if (isset($json->data) && is_iterable($json->data)) {
    foreach ($json->data as $item) {
        echo $item->id . '<br>';
    }
} else {
    die('JSON结构中不存在可遍历的data属性');
}
?>

额外建议

如果服务器禁用了allow_url_fopen,可以改用cURL发起请求,兼容性更好:

$ch = curl_init($path_to_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$file_contents = curl_exec($ch);
curl_close($ch);

// 后续检查和解码逻辑同上

内容的提问来源于stack exchange,提问作者Ayush Kamboj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:50:29