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 に答える