2012-05-16 34 views
4

我试图开发一个小型网站,它从设置的半径从数据库检索结果,并将它们放置在地图上。 我使用谷歌地图API来获取纬度和长度从那里搜索条件,将这些传递给我的PHP脚本,它查询数据库并返回结果集作为JSON对象。搜索数据库与经纬度和长半径使用php mysql

我有一个小的问题,使用json将经纬度和长度都发送到php。

我的主要问题是,我的SQL搜索数据库似乎是错误的,因为它只是检索我的数据库中的前10个结果。我希望它从搜索点返回半径范围内的前10个结果。

这里是我的Ajax代码

function showCarPark(location) 
{ 
    var lat = location.lat(); 
    var lng = location.lng(); 
    //alert("Lat: " +lat.toFixed(6)); 
    //alert("Lng: " +lng.toFixed(6)); 
    document.getElementById('carParkResults').innerHTML = ""; 
    var criterion = document.getElementById("address").value; 
    var count = 0; 
    $.ajax({  
       url: 'process.php', 
       type: 'GET', 
       data: "lat=" + lat + "&lng=" + lng, 
       dataType: 'json', 
       success: function(data) 
       { 
        jQuery.each(data, function() 
        { 
        $('<p>').text("Car Park: " + data[count].name).appendTo('#carParkResults'); 
        placeCarParks(data[count].postcode,data[count].name, data[count].street, data[count].type); 
        count++; 
        }); 
       }, 
       error: function(e) 
       { 
       //called when there is an error 
       console.log(e.message); 
       alert("error" + e.message); 
       } 
    }); 

这里是我的PHP脚本

$rad = 20; 
$lat = $_GET['lat']; 
$lng = 1.4681464; //put a temporary number in as it wont pass the lng in the JSON 

$sql="SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos(radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0 , 10"; 

$result = mysql_query($sql); 

while($r = mysql_fetch_assoc($result)) $rows[] = $r; 

echo json_encode($rows); 

在我的表中的列被称为lat和长 任何帮助表示赞赏。

回答

4

对于您的情况下尝试使用WHERE代替HAVING

SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos(radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark WHERE distance < 15 ORDER BY distance LIMIT 0 , 10 
+0

它不适用于WHERE,因为您使用了您的计数变量。所以你需要使用HAVING,而不是工作。 玩得开心;) – EliaszKubala

1

Larry Ullman在他的书“PHP 5 Advanced:Visual Quickpro Guide”中做了非常类似的事情。

望着他的示例代码,试试这个来计算距离:

ROUND(DEGREES(ACOS(SIN(RADIANS($lat)) 
* SIN(RADIANS(latitude)) 
+ COS(RADIANS($lat)) 
* COS(RADIANS(latitude)) 
* COS(RADIANS($long - longitude)))) * 69.09) AS distance 
0
"SELECT *, (3959 * acos(cos(radians(".$lat.")) * cos(radians(".$lat.")) * cos(radians(".$long.") - radians(".$long.")) + sin(radians(".$lat.")) * sin(radians(".$lat.")))) AS distance FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0, 10" 

您需要解决您查询拉入经度和纬度值。你只是在几个地方传递lat/long这个词。将这个查询与你的比较,看看我的意思。

+0

这很容易被SQL注入。 –

+0

仅当变量未被引用时。谁说他们没有更进一步?无论如何,这不是问题所在。 – iLLin

+0

这仍然很好,指出。如果说Google搜索后没有人在堆栈溢出中找到答案,然后复制并粘贴答案,那将是幼稚的。 –

6

我没有使用HAVING的麻烦。 iLLin的回答是误导性的。这里是要找到从纽约市的距离正确的查询的例子:{:值,名称:值名称}:

  data: {lat : lat, long : long}, 

SELECT *, (3959 * acos(cos(radians('40.7142')) * cos(radians(latitudeColName)) * cos(radians(longitudeColName) - radians('-74.0064')) + sin(radians('40.7142')) * sin(radians(latitudeColName)))) AS distance FROM myTable HAVING distance < 15 ORDER BY distance LIMIT 0 , 10 

变化jQuery的要求使用这个符号线