Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête php pour la latitude et la longitude iOS ne recherchant pas mysql lat et lon à proximité avec une sortie xml

Puisque vous débutez avec PHP, j'ai pensé enregistrer mes observations sur votre script en le parcourant ligne par ligne :

{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }

Les accolades ici sont superflues. Vous souhaiterez peut-être également effectuer des vérifications d'intégrité des entrées (y compris si les paramètres ont été définis).

$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;

Si vous cherchez à rechercher des enregistrements dans une certaine plage sur le terrain, vous voudrez calculer distance orthodromique ; vous devez savoir qu'avec votre approche actuelle, la distance de 0,1 ° de longitude varie avec la latitude, d'aucune distance aux pôles à près de 11 km à l'équateur.

Google a rédigé un guide utile sous Creating a Store Locator with PHP, MySQL &Google Maps  :prêtez une attention particulière à la section sur Rechercher des emplacements avec MySQL et (dans votre cas) Sortir du XML avec PHP .

Placez le reste du code dans un ou plusieurs try { ... } bloque et intercepte toutes les exceptions levées.

$dbh = new PDO('(censored personal information)');

Vérifiez qu'il a réussi :if (!$dbh) die('Unable to create PDO object'); .

Définissez ensuite cet objet PDO pour lever des exceptions $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); et pas simplement pour émuler des instructions préparées $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';

Bien que votre requête puisse changer radicalement en suivant les conseils ci-dessus, il peut toujours être utile de savoir que vous pouvez abréger cette requête en utilisant MySQL BETWEEN ... AND ... opérateur :WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Vous pourriez également trouver votre code plus facile à maintenir si vous utilisez des paramètres nommés au lieu d'espaces réservés :WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

$params = array( $minlat, $maxlat, $minlon, $maxlon );

Si vous utilisez des espaces réservés nommés, vous pouvez utiliser un tableau associatif comme $params = array ( ':minlat' => $minlat, ... ); .

Dans les deux cas, vous pouvez lier des valeurs ou des variables à vos paramètres séparément (ce qui est mon approche préférée, car cela permet facilement de relancer la requête avec seulement quelques paramètres modifiés) :$q->bindParam(':minlat', $minlat); etc.

$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();

Vérifiez qu'il a réussi :if (!$doc) die('Unable to create DOMDocument object'); .

$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {

fetchAll() récupère l'intégralité du jeu de résultats dans PHP, ce qui peut nécessiter beaucoup de mémoire si le jeu de résultats est volumineux. Lorsque l'on souhaite simplement parcourir chaque enregistrement tour à tour, il est généralement préférable de récupérer chaque enregistrement selon les besoins :while ( $row = $q->fetch() ) .

  {

Cette accolade (ainsi que sa paire ci-dessous) est superflue.

    $e = $doc->createElement( "location" );
    $e->setAttribute( 'name', $row['name'] );
    $e->setAttribute( 'd', $d );

Où est votre $d variable déclarée/affectée ?

    $r->appendChild( $e );
  }

Comme mentionné ci-dessus, cette accolade est superflue.

}
print $doc->saveXML();