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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:13:52