从点总是返回空找到最近的位置

时间:2013-11-19 15:53:38

标签: php mysql geolocation geospatial

我正在尝试从我的表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为什么?

3 个答案:

答案 0 :(得分:0)

ORDER BY distance尝试添加ASC后 - 如果没有订单指示,您的查询可能会失败。

答案 1 :(得分:0)

您在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";

答案 2 :(得分:-1)

尝试将变量更改为数字

$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就是数字。
  • 第二个变化几乎肯定是问题所在。您不需要引号,因为绑定过程会使这些事情变得多余 - 这是使用绑定变量的原因之一 - 数据类型的不同行为在很大程度上得到了处理。