【问题标题】: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() 会为您处理引号。

标签: php mysql geolocation geospatial


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

      【讨论】:

      • 我已经编辑了解决方案,以便更清楚地说明我建议更改的原因。
      猜你喜欢
      • 2019-04-02
      • 2012-07-30
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多