Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta php para latitude e longitude do iOS não procurando por mysql lat e lon nas proximidades com uma saída xml


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