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();