【问题标题】:query fails in php file but never in phpmyadmin查询在 php 文件中失败,但从未在 phpmyadmin 中
【发布时间】:2012-05-21 09:28:15
【问题描述】:
$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 英里,并且只想要最接近的匹配,但您可以更改它以提供最近的 # 个位置。我找到了查询here

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

【问题讨论】:

  • 您的数据库有多大?查询在 phpmyadmin 中运行多长时间?
  • 通过 myadmin 显示第 0 - 0 行(共 1 行,查询耗时 0.0006 秒)这两个表都有大约 7,000 行,每行 10 列

标签: php mysql boolean


【解决方案1】:

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

$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 秒。

【讨论】:

  • 没错。正要写一样的,打败我。
  • 如果你使用mysqli_query,那么你也应该使用mysql i_error()
  • 另外,在您的查询中,仅出于调试目的,删除 having distance &lt;= 25 并查看它是否返回任何行。如果有,价值是多少?
  • 查询失败:您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '* PI() / 180) * SIN(lat * PI() / 180) + COS( * PI() / 180) * COS(lat * PI() / 18' 在第 1 行
  • @whatdafrak $lat 的值是多少?那是你问题的根源。我猜它来自用户输入?在查询中使用之前尝试将其转换为 (float)
【解决方案2】:

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

【讨论】:

  • 感谢您的回复。 DaveRandom 在你之前得到了它。我以为这是我的公式,但 $lat 和 $lon 是未定义的。再次感谢。
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多