我的数据库包含lon
和lat
地理位置数据。
两者都保存为mysql表中的float
/ decimal
属性。
现在我想比较这些东西:
(u.user_location_lat <= ".$lat_max." AND u.user_location_lat >= ".$lat_min.") AND
(u.user_location_long <= ".$long_max." AND u.user_location_long >=".$long_min.")
但它没有显示任何结果(它应该!) - 但也没有错误。
如何轻松解决此问题(我实际上不想使用spatial
索引 - 至少我不明白该怎么做?)
感谢。
答案 0 :(得分:0)
我建议您在进行变量替换后验证该语句是什么样的。
即,在准备/执行SQL语句之前,echo
或vardump
包含SQL文本的变量的内容。
谓词的形式似乎没有任何问题。 (这些可以使用等效的BETWEEN比较器编写,但是你写的不是问题。)
您可能会交换min
和max
值,或者交换经度和纬度。如果那不是问题,那么我怀疑被替换的变量可能用科学记数法表示,而不是十进制值。
e.g。生成SQL文本
... u.lat <= 1.241E+2 ...
而不是
... u.lat <= 124.1 ...
在前一种情况下,MySQL会将该文字计算为十进制值1.241。
(当边界框越过+ 180 / -180边界时有一个角点问题,但我不认为你的大多数值可能存在问题,这可能是一个例外情况,你可能会需要设置特殊测试用例才能实现。)
为了调试它,您需要准备/执行发送到数据库的实际SQL文本。
(问题中没有足够的信息来确定实际问题。)
问:如何获取实际的SQL文本?
A:将SQL语句构造为变量的字符串;然后var_dump
该变量用于调试:
$sqltext = "SELECT ... WHERE u.lat <= ". $lat_max . " AND u.lat ... ";
var_dump($sqltext);
$stmt = mysqli_prepare($db, $sqltext);