我正在开发一个应用程序,对于给定的位置(坐标lat/long对),它显示位于给定起始位置给定半径内的所有实体(从数据库中提取)。
我已经测试过了,我用来寻找最近位置的逻辑非常有效。然而,在我的PHP脚本中,为了与MySQL表通信,我遇到了一个问题。
这是我正在尝试的查询,它没有从表中给出任何结果:
$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'";
然而,纬度一点问题都没有。我强烈认为这与语法有关,而且很可能是非常简单的事情。非常感谢您的帮助!
试试这个
$sql = "SELECT * FROM merchants WHERE latitude BETWEEN '$lat1' AND '$lat2' AND longitude BETWEEN $lon1 AND $lon2 AND category='$merchCategory'";
我不确定,但我认为这是因为BETWEEN需要两个数字来表示您的情况,而您将其作为字符串'$lon'
传递。当您对一个值进行硬编码时,另一个值会自动转换为数字值。
旁注:查看准备好的语句(最好)或转义字符串,因为如果用户正在输入lat/lon值,这将打开sql注入。