调用WalkScore API的两个PHP脚本为何一个正常,另一个仅数组最后一项循环报错?
错误原因分析
核心原因:换行符处理不规范导致坐标参数非法
不同操作系统的文本换行符格式存在差异:Windows系统为\r\n、旧版Mac系统为\r、Linux/Unix系统为\n。第二段脚本仅使用\n分割输入内容,会导致除最后一行外的所有坐标对末尾残留\r回车符,比如经度值会变成-72.680463\r。携带非法字符的坐标参数传给WalkScore API后,接口无法识别参数,返回非JSON格式的错误响应,json_decode解析失败返回null,访问null的walkscore属性就触发了对应的Notice报错。
而最后一行坐标末尾没有换行符,参数符合要求,所以仅最后一次循环能返回正确结果;硬编码数组的坐标没有多余隐藏字符,因此运行正常。
次要原因:错误抑制符掩盖请求异常
file_get_contents前添加的@符号抑制了API请求失败时的错误提示,无法直接看到参数非法导致的请求错误,提升了排查难度。
修复方案
- 统一处理换行符,清理坐标的空白隐藏字符
// 先统一替换所有换行格式为\n $input = str_replace(["\r\n", "\r"], "\n", $_POST['input']); $arr = explode("\n", $input); $lats = []; $lons = []; foreach ($arr as $k => $v) { // 修剪掉首尾所有空白、换行、回车符 $v = trim($v); // 跳过空行,避免多余空输入导致错误 if (empty($v)) continue; $coord = explode(",", $v); $lat = trim($coord[0] ?? ''); $lon = trim($coord[1] ?? ''); if (empty($lat) || empty($lon)) continue; array_push($lats, $lat); array_push($lons, $lon); }
- 增加API返回结果校验,避免非法访问报错
for ($i = 0; $i < count($lats); $i++) { $json = getWalkScore($lats[$i], $lons[$i], $address); $json_walkScore = json_decode($json); // 先校验解析结果合法性再访问属性 if (is_object($json_walkScore) && isset($json_walkScore->walkscore)) { echo $lats[$i] . "\r\n"; echo $lons[$i] . "\r\n"; echo $json_walkScore->walkscore . "\r\n"; echo $json_walkScore->description . "\r\n"; } else { echo "坐标".$lats[$i].",".$lons[$i]."查询失败\r\n"; } }
内容的提问来源于stack exchange,提问作者Eric.18
相关产品推荐
相关产品推荐

