sql >> Base de Datos >  >> RDS >> Mysql

consulta php para la latitud y longitud de iOS que no busca mysql lat y lon cercano con una salida xml

Como eres nuevo en PHP, pensé en registrar mis observaciones sobre tu secuencia de comandos recorriéndola línea por línea:

{ $lat = (float)$_GET['lat']; }
{ $lon = (float)$_GET['lon']; }

Los frenos aquí son superfluos. También es posible que desee realizar algunas comprobaciones de cordura de entrada (incluido si los parámetros se establecieron en absoluto).

$minlat = $lat-.1;
$maxlat = $lat+.1;
$minlon = $lon-.1;
$maxlon = $lon+.1;

Si está buscando buscar registros dentro de algún rango en el terreno, querrá calcular distancia de círculo máximo ; debe tener en cuenta que, con su enfoque actual, la distancia de 0,1° de longitud varía con la latitud, desde ninguna distancia en los polos hasta casi 7 millas en el ecuador.

Google ha escrito una guía útil en Creación de un localizador de tiendas con PHP, MySQL y Google Maps :preste especial atención a la sección sobre Búsqueda de ubicaciones con MySQL y (en su caso) Generando XML con PHP .

Coloque el resto del código en uno o más try { ... } bloquea y captura cualquier excepción lanzada.

$dbh = new PDO('(censored personal information)');

Compruebe que tuvo éxito:if (!$dbh) die('Unable to create PDO object'); .

Luego configure este objeto PDO para generar excepciones $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); y no simplemente para emular sentencias preparadas $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';

Si bien su consulta puede cambiar drásticamente siguiendo los consejos anteriores, aún puede ser útil saber que puede abreviar esta consulta usando MySQL BETWEEN ... AND ... operador:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

También puede encontrar su código más fácil de mantener si usa parámetros con nombre en lugar de marcadores de posición:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

$params = array( $minlat, $maxlat, $minlon, $maxlon );

Si usa marcadores de posición con nombre, podría usar una matriz asociativa como $params = array ( ':minlat' => $minlat, ... ); .

En cualquier caso, puede vincular valores o variables a sus parámetros por separado (que es mi enfoque preferido, ya que permite ejecutar la consulta nuevamente con solo algunos parámetros modificados):$q->bindParam(':minlat', $minlat); etc.

$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();

Verifique que haya tenido éxito:if (!$doc) die('Unable to create DOMDocument object'); .

$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {

fetchAll() recupera el conjunto de resultados completo en PHP, lo que podría requerir mucha memoria si el conjunto de resultados es grande. Cuando uno simplemente desea iterar sobre cada registro, generalmente es mejor obtener cada registro según sea necesario:while ( $row = $q->fetch() ) .

  {

Este corsé (junto con su par a continuación) es superfluo.

    $e = $doc->createElement( "location" );
    $e->setAttribute( 'name', $row['name'] );
    $e->setAttribute( 'd', $d );

¿Dónde está tu $d? variable declarada/asignada?

    $r->appendChild( $e );
  }

Como se mencionó anteriormente, este corsé es superfluo.

}
print $doc->saveXML();