0
$query = "SELECT *, ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance 
            FROM average_temp 
            HAVING distance<=25 
            ORDER BY distance ASC limit 1";

我可以在 phpmyadmin 中运行上述查询而不会出现任何问题,但如果我通过我的 php 文件运行它,它大约有 20% 的时间会失败。

这是处理查询结果的代码:

if (!$query){
  die ("Query failed: " . mysql_error());
}
$result = mysqli_query($db, $query);
$num_results = mysqli_num_rows($result);
$row = mysqli_fetch_assoc($result);
$var = $row['id'];

80% 的时间它运行良好,另外 20% 的时间它挂起 30 秒并抛出此错误:

警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,C:\wamp\w 中给出的布尔值

我正在做的是从另一个表中获取纬度和经度值并用这个表引用它们。该公式就像在给定距离内寻找位置的魅力一样。我将其设置为 25 英里,并且只想要最接近的匹配,但您可以更改它以提供最近的 # 个位置。我在这里找到了查询。

有什么想法我可能做错了吗?

4

2 回答 2

2

首先,您不是在测试查询的结果,而是在测试查询字符串本身。它应该是这样的:

$result = mysqli_query($db, $query);
if ($result === false){
    die ("Query failed: " . mysql_error());
}
$num_results = mysqli_num_rows($result);
$row = mysqli_fetch_assoc($result);
$var = $row['id'];

这样你应该从 MySQL 得到正确的错误报告,我猜是超时,因为它挂了 30 秒。

于 2012-05-21T09:33:55.283 回答
0

如果 $lat 或 $lon 为空或未定义,则查询可能会失败。在发送查询之前检查它们。

于 2012-05-21T10:11:50.100 回答