从始终返回空的点查找最近的位置

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 是数字,当您将它们定义为字符串时。 第二个更改几乎肯定是问题所在。您不需要引号,因为绑定过程使这些事情变得多余 - 这是使用绑定变量的原因之一 - 数据类型的不同行为在很大程度上得到了照顾。

【讨论】:

我已经编辑了解决方案,以便更清楚地说明我建议更改的原因。

以上是关于从始终返回空的点查找最近的位置的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试查找哪些字段为空,以便我可以从具有空的数据库中返回数据(非标量字段)

在向量中查找最近的点

5.9 在有序但含有空的数组中查找字符串

如何在距离另一个点最近的点数组中找到点

融合位置始终返回 null

返回与用户位置(地理位置)最近的 3 个位置并为他们列出这些位置