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字段的赋值逻辑,避免直接访问不存在的数组键:
同时若API返回错误状态(如$output['data'] = isset($decode['geonames']) ? $decode['geonames'] : null;$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
相关产品推荐
相关产品推荐

