查找数据库中位于一组lat和long点的特定距离内的所有记录

时间:2009-04-26 03:49:19

标签: php mysql distance latitude-longitude

我已经看过所有的例子,这是我到目前为止所得到的。

我的表很简单:

学校(表名) - School_ID - 拉特 - 长 - 县 - extrainfo

这是我的代码:

<?php

 $con = mysql_connect("xxx","xxx","xxx");



 if (!$con) {

            die('Could not connect: ' . mysql_error());

 } else {}



 mysql_select_db("xxx", $con);

 $latitude = "36.265541";

 $longitude = "-119.207153";

 $distance = "1"; //miles



 $qry = "SELECT *, (3958.75 * ACOS(SIN(" . $latitude . " / 57.2958)*SIN(lat / 57.2958)+COS(" . $latitude . " / 57.2958)*COS(lat / 57.2958)*COS(long / 57.2958 - " . $longitude . " / 57.2958))) as distance FROM schools WHERE (3958.75 * ACOS(SIN(" . $latitude . " / 57.2958)*SIN(lat / 57.2958)+COS(" . $latitude . " / 57.2958)*COS(lat / 57.2958)*COS(long / 57.2958 - " . $longitude . " / 57.2958))) <= " . $distance;

 $results = mysql_query($qry);
 if (mysql_num_rows($results) > 0) {
            while($row = mysql_fetch_assoc($results)) {
                            print_r($row);
            }
 } else {}

 mysql_close($con);

 ?>

但是当我尝试运行它时出现此错误:

警告:mysql_num_rows():提供的参数不是有效的MySQL结果资源

2 个答案:

答案 0 :(得分:3)

首先,'long'是MySQL中的保留关键字。你需要将它包含在反引号中,如下所示:

SELECT `long`,lat FROM schools

可在此处找到保留关键字的完整列表:Reserved Words

如果您可以访问像phpMyAdmin这样的工具,我建议您在那里运行查询测试。

否则,在运行mysql_query()之后尝试在代码中执行它:

print(mysql_errno().' '.mysql_error());

这应该会给你MySQL生成的错误代码和错误消息。除了关键字问题之外,查询看起来还不错,但这肯定会告诉你。

答案 1 :(得分:1)

老实说,我建议您只需抓住所有学校的所有纬度/经度,然后通过PHP代码循环运行Haversine函数。