PHP调用Wikivoyage JSON接口报错,求获取首个snippet的解决方法
解决「Undefined property: stdClass::$searchinfo」错误并获取首个搜索结果的snippet字段
咱们先拆解下你遇到的问题:
你的错误根源是对$data->query的遍历方式不对。看API返回的JSON结构,query里面包含了searchinfo(搜索统计信息)和search(搜索结果数组)两个属性。当你用foreach ($data->query as $country)循环时,第一次拿到的$country就是searchinfo对象本身,这时候你再去访问$country->searchinfo,相当于找一个已经是searchinfo的对象里的searchinfo属性,自然就会抛出「Undefined property」的错误了。
而且你的核心需求是获取首个搜索结果的snippet字段,完全不需要遍历query,直接定位到search数组的第一个元素就行。另外,你原来的代码还漏了初始化curl句柄的关键步骤curl_init(),这会导致curl请求根本跑不起来。
下面是修正后的完整代码:
// 初始化curl句柄,这一步你之前漏掉了! $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, 'https://en.wikivoyage.org/w/api.php?action=query&list=search&srwhat=text&srsearch=India&format=json'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec ($curl); if ($response === false) { die('Error fetching data: ' . curl_error($curl)); } curl_close ($curl); // 解码JSON数据 $data = json_decode($response); // 先检查必要的属性是否存在,避免空指针报错 if (isset($data->query) && isset($data->query->search) && !empty($data->query->search)) { // 获取首个搜索结果的snippet字段 $firstResultSnippet = $data->query->search[0]->snippet; // 转义HTML实体,让snippet里的标签以文本形式显示 echo htmlspecialchars($firstResultSnippet, ENT_QUOTES); } else { echo 'No search results found.'; }
几个关键修正点:
- 补充了
curl_init():没有初始化curl句柄,你的请求根本无法执行,这是基础错误。 - 移除了无效的
foreach循环:直接通过$data->query->search[0]定位到第一个搜索结果,再取snippet属性,这才是你需要的内容。 - 增加了属性存在性检查:用
isset()和!empty()确保API返回的结构符合预期,避免因返回数据异常导致新的报错,让代码更健壮。 - 优化了输出处理:用
htmlspecialchars()转义snippet里的HTML标签,避免浏览器直接解析<span>等元素,而是显示原始的搜索匹配内容。
内容的提问来源于stack exchange,提问作者user9804375
相关产品推荐
相关产品推荐

