Como você é novo no PHP, pensei em registrar minhas observações em seu script percorrendo-o linha por linha:
{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }
As chaves aqui são supérfluas. Você também pode querer realizar algumas verificações de sanidade de entrada (incluindo se os parâmetros foram definidos).
$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;
Se você estiver procurando por registros dentro de algum alcance no terreno, você vai querer calcular distância do grande círculo ; você deve estar ciente de que, com sua abordagem atual, a distância de 0,1° de longitude varia com a latitude, de nenhuma distância nos pólos a quase 7 milhas no equador.
O Google escreveu um guia útil em Criando um localizador de lojas com PHP, MySQL e Google Maps :preste atenção especial à seção sobre Como encontrar locais com MySQL e (no seu caso) Saindo XML com PHP .
Coloque o resto do código em um ou mais
try { ... }
blocos e capturar quaisquer exceções lançadas. $dbh = new PDO('(censored personal information)');
Verifique se foi bem-sucedido:
if (!$dbh) die('Unable to create PDO object');
. Em seguida, defina este objeto PDO para gerar exceções
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
e não meramente para emular instruções preparadas $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
. $sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
Embora sua consulta possa mudar drasticamente seguindo o conselho acima, ainda pode ser útil saber que você pode abreviar essa consulta usando
BETWEEN ... AND ...
operador:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)
. Você também pode achar seu código mais fácil de manter se usar parâmetros nomeados em vez de espaços reservados:
WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)
. $params = array( $minlat, $maxlat, $minlon, $maxlon );
Se estiver usando espaços reservados nomeados, você pode usar um array associativo como
$params = array ( ':minlat' => $minlat, ... );
. Em ambos os casos, você pode vincular valores ou variáveis a seus parâmetros separadamente (que é minha abordagem preferida, pois permite facilmente executar a consulta novamente com apenas alguns parâmetros alterados):
$q->bindParam(':minlat', $minlat);
etc. $q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
Verifique se foi bem sucedido:
if (!$doc) die('Unable to create DOMDocument object');
. $r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {
fetchAll()
busca todo o conjunto de resultados no PHP, o que pode exigir muita memória se o conjunto de resultados for grande. Onde se deseja apenas iterar sobre cada registro, geralmente é melhor buscar cada registro conforme necessário:while ( $row = $q->fetch() )
. {
Esta cinta (juntamente com seu par abaixo) é supérflua.
$e = $doc->createElement( "location" );
$e->setAttribute( 'name', $row['name'] );
$e->setAttribute( 'd', $d );
Onde está seu
$d
variável declarada/atribuída? $r->appendChild( $e );
}
Como mencionado acima, esta cinta é supérflua.
}
print $doc->saveXML();