sql >> Database >  >> RDS >> Mysql

php-query voor iOS-breedtegraad en -lengte niet zoeken naar mysql lat en lon in de buurt met een xml-uitvoer

Aangezien PHP nieuw voor je is, dacht ik dat ik mijn observaties over je script zou vastleggen door er regel voor regel doorheen te lopen:

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

De beugels zijn hier overbodig. Misschien wil je ook wat input-sanity checks uitvoeren (inclusief of de parameters überhaupt zijn ingesteld).

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

Als u op zoek bent naar records binnen een bepaald bereik op de grond, moet u berekenen grote cirkel afstand ; u moet zich ervan bewust zijn dat, met uw huidige benadering, de afstand van 0,1° lengtegraad varieert met de breedtegraad, van geen enkele afstand op de polen tot bijna 7 mijl op de evenaar.

Google heeft een handige handleiding geschreven onder Een winkelzoeker maken met PHP, MySQL en Google Maps :let vooral op het gedeelte over Locaties vinden met MySQL en (in jouw geval) XML uitvoeren met PHP .

Plaats de rest van de code in een of meer try { ... } blokken en vang alle gegooide uitzonderingen.

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

Controleer of het gelukt is:if (!$dbh) die('Unable to create PDO object'); .

Stel vervolgens dit PDO-object in om uitzonderingen op te heffen $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); en niet alleen om voorbereide instructies te emuleren $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

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

Hoewel uw zoekopdracht drastisch kan veranderen na het bovenstaande advies, kan het toch handig zijn om te weten dat u deze zoekopdracht kunt inkorten met MySQL's BETWEEN ... AND ... operator:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Mogelijk vindt u uw code ook gemakkelijker te onderhouden als u benoemde parameters gebruikt in plaats van tijdelijke aanduidingen:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

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

Als u tijdelijke aanduidingen met een naam gebruikt, kunt u een associatieve array gebruiken als $params = array ( ':minlat' => $minlat, ... ); .

In beide gevallen zou je waarden of variabelen afzonderlijk aan je parameters kunnen binden (wat mijn voorkeursbenadering is, omdat het je gemakkelijk in staat stelt om de query opnieuw uit te voeren met slechts enkele parameters gewijzigd):$q->bindParam(':minlat', $minlat); enz.

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

Controleer of het is gelukt:if (!$doc) die('Unable to create DOMDocument object'); .

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

fetchAll() haalt de volledige resultatenset op in PHP, wat veel geheugen kan vergen als de resultatenset groot is. Waar men slechts elk record om de beurt wil herhalen, is het gewoonlijk beter om elk record naar wens op te halen:while ( $row = $q->fetch() ) .

  {

Deze beugel (samen met het paar hieronder) is overbodig.

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

Waar is je $d variabele gedeclareerd/toegewezen?

    $r->appendChild( $e );
  }

Zoals hierboven vermeld is deze beugel overbodig.

}
print $doc->saveXML();



  1. maak een array van mysql-query php

  2. Creëert een externe sleutel automatisch een index?

  3. Aan de slag met Django-kanalen

  4. Sequelize:meerdere waar clausule