Mysql
 sql >> Database >  >> RDS >> Mysql

query php per latitudine e longitudine iOS che non cercano mysql lat e lon nelle vicinanze con un output xml

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