从始终返回空的点查找最近的位置
Posted
技术标签:
【中文标题】从始终返回空的点查找最近的位置【英文标题】:Find nearest location from point always returning empty 【发布时间】:2013-11-19 15:53:37 【问题描述】:我正在尝试从我的表 geo_address
中获取一些结果,我已经按照谷歌的 this 教程进行操作,但结果始终为空。 $lat
和 $lng
取自表中的实际数据......所以至少它应该显示 1 个结果。
我错过了什么?
$lat = "51.460873";
$lng= "-0.219140";
$radius = "15";
$sql = "SELECT lat, lng, ( 3959 * acos( cos( radians(':lat') ) *
cos( radians( lat ) ) * cos( radians( lng ) - radians(':lng') )
+ sin( radians(':lat') ) * sin( radians( lat ) ) ) )
AS distance FROM geo_address
HAVING distance < ':radius' ORDER BY distance LIMIT 0 , 20";
$query = $this->db();
$query = $query->prepare($sql);
$query->bindValue(":lat",$lat);
$query->bindValue(":lng",$lng);
$query->bindValue(":radius",$radius);
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
if (empty($result))
echo "empty";
return;
编辑:我将值硬编码到查询中后,它现在返回结果,但我无法让它与 bindValue
一起使用,为什么?
【问题讨论】:
您没有检查来自数据库查询的任何返回值 - 您的var_dump($result)
返回什么?
array(0)
这是我的转储
如果你去掉 HAVING 子句,你会得到任何结果吗?
您的查询中有两个对 :lat
的引用 - 我不知道您是否可以一次绑定到多个占位符。此外,您在查询 (':lat'
) 中的占位符周围有引号,而这些不是必需的 - 您的 prepare
() 会为您处理引号。
【参考方案1】:
在ORDER BY distance
之后尝试添加ASC
-- 如果没有订单方向,您的查询可能会失败。
【讨论】:
【参考方案2】:您在 sql 中引用参数,即 ':lat'
。
尝试删除它们。
$sql = "SELECT lat, lng, ( 3959 * acos( cos( radians(:lat) ) *
cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) )
+ sin( radians(:lat) ) * sin( radians( lat ) ) ) )
AS distance FROM geo_address
HAVING distance < :radius ORDER BY distance LIMIT 0 , 20";
【讨论】:
【参考方案3】:尝试将变量更改为数字
$lat = "51.460873";
$lng= "-0.219140";
$radius = "15";
变成:
$lat = 51.460873;
$lng = -0.219140;
$radius = 15;
然后从 SQL 语句中的绑定变量中删除(不必要的)引号:
radians(':lat')
radians(':long')
distance < ':radius'
成为
radians(:lat)
radians(:long)
distance < :radius
我建议第一个,因为保持数据类型与其内容一致是有意义的,无论这是否会导致您的特定实现出现问题。稍后会很容易回到这一点并添加更多代码,假设 lat、lng 和 radius 是数字,当您将它们定义为字符串时。
第二个更改几乎肯定是问题所在。您不需要引号,因为绑定过程使这些事情变得多余 - 这是使用绑定变量的原因之一 - 数据类型的不同行为在很大程度上得到了照顾。
【讨论】:
我已经编辑了解决方案,以便更清楚地说明我建议更改的原因。以上是关于从始终返回空的点查找最近的位置的主要内容,如果未能解决你的问题,请参考以下文章