0

我有一个包含lon地理位置lat 数据的数据库。两者都保存为表中的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索引 - 至少我不明白该怎么做)?

谢谢。

4

1 回答 1

0

我建议您在进行变量替换后验证该语句的外观。

也就是说,在准备/执行 SQL 语句之前,echo或者vardump包含 SQL 文本的变量的内容。

谓词的形式似乎没有任何问题。(这些可以使用等效的 BETWEEN 比较器来编写,但你写的不是问题。)

您可能交换了minmax值,或者交换了经度和纬度。如果这不是问题,那么我怀疑被替换的变量可能以科学计数法表示,而不是十进制值。

例如生成 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);
于 2013-09-07T03:20:40.867 回答