Dato che non conosci PHP, ho pensato di registrare le mie osservazioni sul tuo script esaminandolo riga per riga:
{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }
Le parentesi graffe qui sono superflue. Potresti anche voler eseguire alcuni controlli di integrità dell'input (incluso se i parametri sono stati impostati).
$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;
Se stai cercando di cercare record all'interno di un certo intervallo sul campo, ti consigliamo di calcolare distanza del cerchio grande ; dovresti essere consapevole che, con il tuo approccio attuale, la distanza di 0,1° di longitudine varia con la latitudine di una persona, da nessuna distanza ai poli a quasi 7 miglia all'equatore.
Google ha scritto un'utile guida in Creazione di un localizzatore di negozi con PHP, MySQL e Google Maps :presta particolare attenzione alla sezione su Trovare posizioni con MySQL e (nel tuo caso) Output XML con PHP .
Inserisci il resto del codice in uno o più try { ... }
blocca e rileva le eccezioni generate.
$dbh = new PDO('(censored personal information)');
Verifica che sia riuscito:if (!$dbh) die('Unable to create PDO object');
.
Quindi imposta questo oggetto PDO per sollevare eccezioni $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
e non semplicemente per emulare istruzioni preparate $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
.
$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
Anche se la tua query potrebbe cambiare radicalmente seguendo i consigli di cui sopra, può comunque essere utile sapere che puoi abbreviare questa query utilizzando BETWEEN ... AND ...
operatore:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)
.
Potresti anche trovare il tuo codice più facile da mantenere se usi parametri denominati invece di segnaposto:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)
.
$params = array( $minlat, $maxlat, $minlon, $maxlon );
Se si utilizzano segnaposto denominati, è possibile utilizzare un array associativo come $params = array ( ':minlat' => $minlat, ... );
.
In entrambi i casi, puoi associare valori o variabili ai tuoi parametri separatamente (che è il mio approccio preferito, poiché consente facilmente di eseguire nuovamente la query con solo alcuni parametri modificati):$q->bindParam(':minlat', $minlat);
ecc.
$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
Verifica che sia riuscito:if (!$doc) die('Unable to create DOMDocument object');
.
$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {
fetchAll()
recupera l'intero set di risultati in PHP, che potrebbe richiedere molta memoria se il set di risultati è di grandi dimensioni. Laddove si desidera semplicemente scorrere ogni record a turno, di solito è meglio recuperare ogni record come richiesto:while ( $row = $q->fetch() )
.
{
Questa parentesi graffa (insieme alla sua coppia sotto) è superflua.
$e = $doc->createElement( "location" );
$e->setAttribute( 'name', $row['name'] );
$e->setAttribute( 'd', $d );
Dov'è il tuo $d
variabile dichiarata/assegnata?
$r->appendChild( $e );
}
Come accennato in precedenza, questo tutore è superfluo.
}
print $doc->saveXML();