Ponieważ jesteś nowy w PHP, pomyślałem, że zapiszę moje obserwacje w twoim skrypcie, przechodząc przez niego wiersz po wierszu:
{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }
Aparat ortodontyczny jest tutaj zbyteczny. Możesz również chcieć przeprowadzić pewne kontrole poprawności danych wejściowych (w tym, czy parametry zostały w ogóle ustawione).
$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;
Jeśli szukasz rekordów w pewnym zasięgu na ziemi, będziesz chciał obliczyć odległość wielkiego kręgu ; należy mieć świadomość, że przy obecnym podejściu odległość 0,1° długości geograficznej zmienia się w zależności od szerokości geograficznej, od żadnej odległości na biegunach do prawie 7 mil na równiku.
Firma Google napisała przydatny przewodnik w sekcji Tworzenie lokalizatora sklepów za pomocą PHP, MySQL i Map Google :zwróć szczególną uwagę na sekcję Znajdowanie lokalizacji za pomocą MySQL i (w Twoim przypadku) Wysyłanie XML za pomocą PHP .
Umieść resztę kodu w co najmniej jednym try { ... }
blokuje i łapie wszelkie zgłoszone wyjątki.
$dbh = new PDO('(censored personal information)');
Sprawdź, czy się udało:if (!$dbh) die('Unable to create PDO object');
.
Następnie ustaw ten obiekt PDO tak, aby zgłaszał wyjątki $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
a nie tylko do emulowania przygotowanych instrukcji $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
.
$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
Chociaż Twoje zapytanie może się radykalnie zmienić zgodnie z powyższymi radami, nadal warto wiedzieć, że możesz je skrócić, używając BETWEEN ... AND ...
operator:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)
.
Możesz również uznać swój kod za łatwiejszy w utrzymaniu, jeśli użyjesz nazwanych parametrów zamiast symboli zastępczych:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)
.
$params = array( $minlat, $maxlat, $minlon, $maxlon );
Jeśli używasz nazwanych symboli zastępczych, możesz użyć tablicy asocjacyjnej jako $params = array ( ':minlat' => $minlat, ... );
.
W obu przypadkach możesz osobno powiązać wartości lub zmienne z parametrami (co jest moim preferowanym podejściem, ponieważ umożliwia łatwe ponowne uruchomienie zapytania ze zmienionymi tylko niektórymi parametrami):$q->bindParam(':minlat', $minlat);
itp.
$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
Sprawdź, czy się udało:if (!$doc) die('Unable to create DOMDocument object');
.
$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {
fetchAll()
pobiera cały zestaw wyników do PHP, co może wymagać dużej ilości pamięci, jeśli zestaw wyników jest duży. Tam, gdzie chce się po prostu iterować po każdym rekordzie, zwykle lepiej jest pobrać każdy rekord zgodnie z wymaganiami:while ( $row = $q->fetch() )
.
{
Ta klamra (wraz z parą poniżej) jest zbędna.
$e = $doc->createElement( "location" );
$e->setAttribute( 'name', $row['name'] );
$e->setAttribute( 'd', $d );
Gdzie jest twój $d
zadeklarowana/przypisana zmienna?
$r->appendChild( $e );
}
Jak wspomniano powyżej, ta klamra jest zbędna.
}
print $doc->saveXML();