安卓端传经纬度至PHP计算数据库门店距离并排序的实现问题
问题解答
你的疑问解答
- 关于SQL中
latitude读取问题:只要你的门店表的经纬度列名确实是latitude(纬度)、longitude(经度),写法完全正确,可以正常读取表中对应列的数值。 - 关于
AS distance、ORDER BY distance的合法性:写法完全正确。AS distance是给你通过公式计算出来的距离值临时起的别名,不需要你的表中有同名实体字段,ORDER BY可以直接调用这个别名排序,这个逻辑本身没有问题。
导致功能失效的真实错误点
你代码中存在多个拼写、语法、逻辑错误,才是功能无法运行的核心原因:
- 变量拼写错误
你SQL语句中写的是$user_logitude,但你实际接收参数定义的变量是$user_longitude,少写了一个字母n,导致经度参数传递错误,距离计算必然失败。 - SELECT查询遗漏需要的字段
你当前的SELECT语句只返回了计算出来的distance一列,没有查询你需要的name、latitude、longitude字段,所以后续取$row[1]、$row[2]、$row[3]完全取不到对应值,返回的数组全为空。 - 排序规则错误
你当前用的是ORDER BY distance DESC,是按距离从远到近排序,如果你要离用户近的门店排在前面,应该改为ORDER BY distance ASC。 - 语法&逻辑错误
mysqli_connect("“)这里用了中文双引号,要改为英文双引号"- 末尾的if判断逻辑错误且缺少闭合大括号:你安卓端是GET方式传参,你写的if判断要求是POST请求提交
submit参数或者$android变量存在,但你既没有定义$android变量,也没有用POST请求,所以永远不会执行输出JSON的逻辑,前端拿不到返回结果。
修正后的可运行PHP代码参考
<?php error_reporting(E_ALL); ini_set("display_errors", 1); // 替换为你自己的数据库连接信息 $con = mysqli_connect("主机地址", "用户名", "密码", "数据库名"); mysqli_set_charset($con,"utf8"); // 接收安卓端GET参数 $user_latitude = $_GET['user_latitude']; $user_longitude = $_GET['user_longitude']; // 修正后的SQL:查询需要的字段+距离计算,按距离升序 $sql = "SELECT name, latitude, longitude, (6371*acos(cos(radians(" . $user_latitude . "))*cos(radians(latitude)) *cos(radians(longitude)-radians(" . $user_longitude . ")) +sin(radians(" . $user_latitude . "))*sin(radians(latitude)))) AS distance FROM 你的实际表名 ORDER BY distance ASC"; $res = mysqli_query($con, $sql); $place = array(); // 对应返回字段索引:0=name,1=latitude,2=longitude,3=distance while($row = mysqli_fetch_row($res)) { array_push($place, array( 'name'=>$row[0], 'latitude'=>$row[1], 'longitude'=>$row[2], 'distance'=>$row[3] )); } // 直接输出JSON,不需要多余的POST判断 echo json_encode(array("place"=>$place), JSON_UNESCAPED_UNICODE); mysqli_close($con); ?>
补充优化建议(可选)
后续可以把SQL拼接改为预处理语句,避免SQL注入风险,当前先保证基础功能跑通即可。
内容的提问来源于stack exchange,提问作者spring0806
相关产品推荐
相关产品推荐

