0

Google からのこのクエリを使用:リンク

位置検索を作成しようとしており、設定された距離内にあるすべての町を返します。町をフォームに入力できるようにしたいのですが、私のコードは町名の緯度と経度を見つけてから、データベースにクエリを実行して、設定された距離内にあるすべての町を返します。

まず、入力された場所の緯度と経度を見つけます。

    $location = 'farnborough';

    function getlatlang($location) {
    $geocode = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='. urlencode($location) .'&sensor=false');  
    $output= json_decode($geocode);  
    return $output->results[0]->geometry->location; 
    }

    $objlocation = getlatlang($location);  
    $latitude = $objlocation->lat;  
    $longitude = $objlocation->lng;

これはうまくいきます。結果をエコーでき、値は正しいです。

次に、上記のリンクのクエリを使用して、次のことを試します。

    $query = "SELECT town, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( lat ) ) ) ) AS distance FROM uk_postcode_05 HAVING distance < 25 ORDER BY distance ASC LIMIT 0 , 5";
    $result = mysqli_query($mysqli, $query);
    if(!$result){echo('no result returned - query wrong');
    }

しかし、クエリは機能せず、常にエラーが発生します。ここで何が間違っていますか?

(私のテーブルには、町、郵便番号、緯度、経度の列があります)

4

2 に答える 2

0

ここでは、テーブル定義で列名をlat、lngからlatitude、longitudeに変更したと仮定しています。

そして、実際のエラーメッセージがないので、これが最良の推測です。

SELECT
  town,
  (
    3959 * acos(
      cos(
        radians($latitude)
      ) * cos(
        radians(latitude)
      ) * cos(
        radians(longitude) - radians($longitude)
      ) + sin(
        radians($latitude)
      ) * sin(
        radians(latitude)
      )
    )
  ) AS distance
FROM
  uk_postcode_05
HAVING
  distance < 25
ORDER BY
  distance ASC
LIMIT
  0, 5

クエリ内latおよびlng未定義の場合、これで問題が修正されるはずです。

于 2013-02-09T13:12:48.647 に答える
0

問題は、WHERE の代わりに HAVING を使用していることと、HAVING 句で定義されていないにもかかわらず「距離」を使用していることです。これを試して:

SELECT town, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( lat ) ) ) ) AS distance FROM uk_postcode_05 WHERE ( 3959 * acos( cos( radians($latitude) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( lat ) ) ) ) < 25 ORDER BY distance ASC LIMIT 0 , 5
于 2013-02-09T12:44:40.380 に答える