PHP调用返回JSON的API提取Data字段时出现非对象属性获取错误
嘿,这个报错我之前踩过好几次!咱们先搞懂为啥会出这个问题,再一步步把代码修好:
问题根源
这个Notice: Trying to get property 'Data' of non-object错误本质很简单:你想访问某个“对象”的Data属性,但这个所谓的“对象”根本不是合法对象——它可能是null、false、数组,甚至是一堆乱码字符串。
你的代码里的明显bug
先揪出最显眼的低级错误:你定义$url的时候多写了一个右括号!
// 原错误代码: $url = "https://api.weleakinfo.com/v2/public/email/$email"); // 修正后: $url = "https://api.weleakinfo.com/v2/public/email/$email";
这个语法错误会直接导致代码执行中断,连API请求都发不出去,更别说拿到有效响应了。
完整修复后的代码(带全链路安全检查)
我给你补全了所有必要的错误校验环节,避免再踩类似的坑:
<?php ini_set("allow_url_fopen", 1); if(isset($_GET['email'])) { $email = $_GET['email']; // 修复语法错误:移除多余的右括号 $url = "https://api.weleakinfo.com/v2/public/email/$email"; $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url); // 别忘了设置请求URL!原代码可能遗漏了这行 // 执行请求并获取响应 $response = curl_exec($ch); // 检查CURL请求是否失败(比如网络问题、API地址错误) if(curl_errno($ch)) { die("请求失败:" . curl_error($ch)); } curl_close($ch); // 解析JSON并检查是否解析成功 $data = json_decode($response); if(json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败:" . json_last_error_msg()); // 调试时可以打开下面这行,看看API实际返回的内容 // echo "原始响应:" . $response; } // 安全访问Data字段(先判断是否存在) if(isset($data->Data)) { // 这里写你的业务逻辑,比如打印或处理Data内容 print_r($data->Data); } else { echo "API响应中没有找到Data字段,或者响应结构不符合预期"; // 调试用:打印完整解析后的数据,看看API返回的结构 // print_r($data); } } else { echo "请通过?email=xxx的方式传入邮箱参数"; } ?>
关键修复细节
- 修复语法错误:去掉URL末尾多余的右括号,确保代码能正常执行
- 增加CURL请求校验:用
curl_errno判断请求是否成功,避免请求失败后还去解析无效的响应内容 - 增加JSON解析校验:用
json_last_error确保响应是有效的JSON格式,否则json_decode会返回null,此时访问null->Data就会触发你遇到的Notice - 安全访问属性:用
isset($data->Data)先判断属性是否存在,再去访问,避免直接访问不存在的属性导致报错
额外小提示
如果API返回的是JSON数组(而非对象),你可以把json_decode($response)改成json_decode($response, true),这样会得到一个关联数组,之后用isset($data['Data'])和$data['Data']来访问对应字段即可。
内容的提问来源于stack exchange,提问作者Morde Cai
相关产品推荐
相关产品推荐

