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

AJAX POST请求返回“Undefined array key”错误排查求助

问题:调用Geonames API时无法获取"geonames"数组数据

调用Geonames API的AJAX请求返回状态码正常,但始终无法访问geonames数组,data字段为null,同时收到PHP警告:

Warning: Undefined array key "geonames" in C:\xampp\htdocs\task\libs\php\ocean.php on line 25

{"status":{"code":"200","name":"ok","description":"success","returnedIn":"72 ms"},"data":null}

相关代码

JavaScript

$('#oeanBtnRun').click(function() {
    $.ajax({
        url: "Oceanlibs/php/ocean.php",
        type: 'POST',
        dataType: 'json',
        data: {
            lat: $('#selLat').val(),
            lng: $('#selLng').val(),
        },
        success: function(result) {
            console.log(JSON.stringify(result));
            if (result.status.name == "ok") {
                $('#results').html(result['data']);
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(jqXHR, textStatus, errorThrown);
        }
    }); 
});

HTML

<tr>
     <td>2. Get Ocean</td>
     <td>
    <label>Latitude: </label><input id="selLat" type="number"></input>
    <label>Longitude: </label><input id="selLng" type="number"></input>
     </td>
     <td><button class="oceanBtnRun">Run</button></td>
</tr>

PHP

<?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $executionStartTime = microtime(true);

    $url='http://api.geonames.org/neighbourhoodJSON?formatted=true&lat=' . $_REQUEST['lat'] . '&lng=' . $_REQUEST['lng'] .'&username=kerriemcivor92&style=full';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL,$url);
    
    $result=curl_exec($ch);

    curl_close($ch);

    $decode = json_decode($result,true);    

    $output['status']['code'] = "200";
    $output['status']['name'] = "ok";
    $output['status']['description'] = "success";
    $output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms";
    $output['data'] = $decode['geonames'];

    header('Content-Type: application/json; charset=UTF-8');

    echo json_encode($output); 
?>

解决思路

  • 排查API原始返回内容:在PHP中添加var_dump($result); exit;,直接查看Geonames API返回的原始数据,确认是否存在geonames字段。若坐标不在居民区范围内,API可能返回无geonames的结构甚至错误信息。
  • 校验请求参数合法性:确保传入的经纬度是有效数值(纬度范围[-90,90]、经度范围[-180,180]),避免因参数非法导致API返回异常结构。
  • 添加数组键存在性判断:修改PHP中data字段的赋值逻辑,避免直接访问不存在的数组键:
    $output['data'] = isset($decode['geonames']) ? $decode['geonames'] : null;
    
    同时若API返回错误状态(如$decode['status']['code']非200),需同步修改$output的状态信息,不要固定返回200。
  • 检查CURL请求是否成功:在CURL执行后添加错误检查,避免因请求失败导致$result无效:
    if(curl_errno($ch)) {
        $output['status']['code'] = "500";
        $output['status']['name'] = "error";
        $output['status']['description'] = curl_error($ch);
        echo json_encode($output);
        exit;
    }
    
  • 修正JS选择器错误:JS中绑定点击事件的选择器是#oeanBtnRun(少了字母c),但HTML按钮仅设置了class="oceanBtnRun",需统一选择器类型,比如将按钮改为id="oceanBtnRun",或JS中使用.oceanBtnRun类选择器,确保点击事件能触发请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:20:18