Da Sie neu bei PHP sind, dachte ich, ich schreibe meine Beobachtungen in Ihrem Skript auf, indem ich es Zeile für Zeile durchgehe:
{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }
Die Klammern sind hier überflüssig. Vielleicht möchten Sie auch einige Plausibilitätsprüfungen der Eingabe durchführen (einschließlich, ob die Parameter überhaupt gesetzt wurden).
$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;
Wenn Sie am Boden nach Aufzeichnungen innerhalb einer bestimmten Reichweite suchen, sollten Sie berechnen Großkreisentfernung ; Sie sollten sich darüber im Klaren sein, dass bei Ihrer aktuellen Annäherung der Abstand von 0,1° Länge mit dem Breitengrad variiert, von keiner Entfernung an den Polen bis zu fast 7 Meilen am Äquator.
Google hat eine nützliche Anleitung unter Creating a Store Locator with PHP, MySQL &Google Maps :Achten Sie besonders auf den Abschnitt zum Suchen von Standorten mit MySQL und (in Ihrem Fall) XML mit PHP ausgeben .
Platzieren Sie den Rest des Codes in einem oder mehreren try { ... }
blockiert und alle ausgelösten Ausnahmen abfängt.
$dbh = new PDO('(censored personal information)');
Überprüfen Sie, ob es erfolgreich war:if (!$dbh) die('Unable to create PDO object');
.
Setzen Sie dann dieses PDO-Objekt, um Ausnahmen auszulösen $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
und nicht nur vorbereitete Anweisungen zu emulieren $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
.
$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
Auch wenn sich Ihre Abfrage nach den obigen Ratschlägen dramatisch ändern kann, kann es trotzdem nützlich sein zu wissen, dass Sie diese Abfrage mit BETWEEN ... AND ...
Operator:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)
.
Möglicherweise ist Ihr Code auch einfacher zu warten, wenn Sie benannte Parameter anstelle von Platzhaltern verwenden:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)
.
$params = array( $minlat, $maxlat, $minlon, $maxlon );
Wenn Sie benannte Platzhalter verwenden, können Sie ein assoziatives Array als $params = array ( ':minlat' => $minlat, ... );
verwenden .
In beiden Fällen könnten Sie Werte oder Variablen separat an Ihre Parameter binden (was mein bevorzugter Ansatz ist, da es einem leicht ermöglicht, die Abfrage mit nur einigen geänderten Parametern erneut auszuführen):$q->bindParam(':minlat', $minlat);
usw.
$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
Überprüfen Sie, ob es erfolgreich war:if (!$doc) die('Unable to create DOMDocument object');
.
$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {
fetchAll()
ruft die gesamte Ergebnismenge in PHP ab, was bei großen Ergebnismengen viel Speicher erfordern kann. Wenn man nur nacheinander über jeden Datensatz iterieren möchte, ist es normalerweise besser, jeden Datensatz nach Bedarf abzurufen:while ( $row = $q->fetch() )
.
{
Diese Klammer (zusammen mit ihrem Paar unten) ist überflüssig.
$e = $doc->createElement( "location" );
$e->setAttribute( 'name', $row['name'] );
$e->setAttribute( 'd', $d );
Wo ist Ihr $d
Variable deklariert/zugewiesen?
$r->appendChild( $e );
}
Wie oben erwähnt, ist diese Klammer überflüssig.
}
print $doc->saveXML();