2009-04-26 3 views
4

J'ai vu tous les exemples et voici ce que j'ai obtenu jusqu'à présent.Trouver tous les enregistrements dans la base de données qui sont dans une certaine distance d'un ensemble de points lat et long

ma table est simple:

écoles (nom de la table) - School_ID - lat - longue - comté - extrainfo

voici mon code:

<?php 

$con = mysql_connect("xxx","xxx","xxx"); 



if (!$con) { 

      die('Could not connect: ' . mysql_error()); 

} else {} 



mysql_select_db("xxx", $con); 

$latitude = "36.265541"; 

$longitude = "-119.207153"; 

$distance = "1"; //miles 



$qry = "SELECT *, (3958.75 * ACOS(SIN(" . $latitude . "/57.2958)*SIN(lat/57.2958)+COS(" . $latitude . "/57.2958)*COS(lat/57.2958)*COS(long/57.2958 - " . $longitude . "/57.2958))) as distance FROM schools WHERE (3958.75 * ACOS(SIN(" . $latitude . "/57.2958)*SIN(lat/57.2958)+COS(" . $latitude . "/57.2958)*COS(lat/57.2958)*COS(long/57.2958 - " . $longitude . "/57.2958))) <= " . $distance; 

$results = mysql_query($qry); 
if (mysql_num_rows($results) > 0) { 
      while($row = mysql_fetch_assoc($results)) { 
          print_r($row); 
      } 
} else {} 

mysql_close($con); 

?> 

mais je obtenir cette erreur lorsque je tente de l'exécuter:

Attention: mysql_num_rows(): l'argument fourni n'est pas une ressource de résultat MySQL valide

+0

Cela signifie que votre requête a échoué. Imprimez la chaîne de requête et essayez de l'exécuter dans la ligne de commande. Cela vous donnera une image plus détaillée de l'échec. – Calvin

Répondre

1

Pour être honnête, je vous recommande de saisir tout le lat/long pour toutes les écoles et de boucler en exécutant une fonction de Haversine à travers votre code PHP.

+0

En supposant que cette requête soit utilisée pour trouver des écoles près d'un endroit donné, je ne pense pas que les distances explorées soient assez grandes pour exiger de prendre en compte la courbure de la terre. Et la Terre n'est pas une sphère parfaite en tout cas, donc si vous vouliez une mesure précise, vous deviez utiliser les formules de Vincenty. – Calvin

+0

vous pouvez optimiser cette suggestion en créant une boîte englobante autour du cercle défini par la distance == rayon, créer un résultat de requête SQL avec moins de résultats. Ensuite, faites une distance haversine sur cet ensemble – jottos

+1

@Calvin, je ne suis pas sûr de ce que vous essayez de me dire exactement. Je suis bien conscient que la Terre n'est pas une sphère parfaite mais l'utilisation de Haversine est plutôt bonne et peut-être la méthode la plus courante dans les applications où la précision absolue n'est pas requise. @jottos, peut-être, mais juste les faire tous et faire Haversine vous rapproche un peu plus de ce qu'il a maintenant. :) – BobbyShaftoe

3

D'abord, 'long' est un mot-clé réservé dans MySQL. Vous aurez besoin de l'enfermer dans des contre-apostrophes comme ceci:

SELECT `long`,lat FROM schools 

Liste complète des mots-clés réservés peuvent être trouvés ici: Reserved Words

Si vous avez accès à un outil comme phpMyAdmin, je recommande l'exécution de votre test de recherche Là.

Sinon, essayez d'exécuter dans votre code après l'exécution mysql_query():

print(mysql_errno().' '.mysql_error()); 

Cela devrait vous donner le code d'erreur et le message d'erreur généré par MySQL. La requête semble ok autre que le problème de mot-clé, mais cela vous le dira définitivement.

Questions connexes