0

我正在开发一个应用程序,对于给定位置(坐标纬度/经度对),它显示位于给定起始位置的给定半径内的所有实体(从数据库中提取)。

我已经测试过了,我用来查找最近位置的逻辑效果很好。但是,在我与 MySQL 表通信的 PHP 脚本中,我遇到了一个问题。

这是我正在尝试的查询,它没有从表中得到任何结果:

$sql = "SELECT * FROM merchants WHERE latitude BETWEEN '$lat1' AND '$lat2' AND longitude BETWEEN '$lon1' AND -90.2745 AND category='$merchCategory'";           

但是,通过回显 $lat1、$lat2、$lon1 和 $lon2,我知道它们包含有效值(应该从查询中产生结果(仅供参考:这 4 个变量表示从给定位置开始的半径平方;纬度经度是表中的列。)

$lon1= -90.644843447 $lon2= -90.274500553 $lat1= 38.3496784638 $lat2= 38.6395335362

但是,可行(只是对值进行硬编码,而不是使用 $lon2 变量引用它:

$sql = "SELECT * FROM cashbackengine_merchants WHERE latitude BETWEEN '$lat1' AND '$lat2' AND longitude BETWEEN '$lon1' AND **-90.2745** AND category='$merchCategory'";            

就像这样:

$sql = "SELECT * FROM cashbackengine_merchants WHERE latitude BETWEEN '$lat1' AND '$lat2' AND longitude BETWEEN **-90.64484** AND '$lon2' AND category='$merchCategory'";           

然而,纬度完全没有问题。我强烈认为这与语法有关,并且可能非常简单。任何帮助是极大的赞赏!

4

1 回答 1

1

尝试这个

$sql = "SELECT * FROM merchants WHERE latitude BETWEEN '$lat1' AND '$lat2' AND longitude BETWEEN $lon1 AND $lon2 AND category='$merchCategory'";

我不确定,但我认为这是因为 BETWEEN 需要两个数字来处理您的情况,并且您将其作为 string 传递'$lon'。当您硬编码一个值时,另一个值会自动转换为数字值。

旁注:查看准备好的语句(最好)或转义字符串,因为如果用户正在输入纬度/经度值,这会为您打开 sql 注入。

于 2012-08-04T05:09:24.727 回答