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

php-forespørgsel til iOS bredde- og længdegrad søger ikke efter nærliggende mysql lat og lon med et xml-output

Da du er ny til PHP, tænkte jeg, at jeg ville optage mine observationer på dit script ved at gå igennem det linje for linje:

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

Selerne her er overflødige. Du ønsker måske også at udføre nogle inddatatilregnelighedstjek (inklusive om parametrene overhovedet blev indstillet).

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

Hvis du ønsker at søge efter poster inden for et eller andet område på jorden, vil du gerne beregne stor cirkelafstand ; du skal være opmærksom på, at med din nuværende tilgang varierer afstanden på 0,1° længdegrad med ens breddegrad, fra ingen som helst afstand ved polerne til næsten 7 miles ved ækvator.

Google har skrevet en nyttig vejledning under Oprettelse af en butiksfinder med PHP, MySQL og Google Maps :vær særlig opmærksom på afsnittet om Sådan finder du placeringer med MySQL og (i dit tilfælde) Udlæsning af XML med PHP .

Placer resten af ​​koden i en eller flere try { ... } blokerer og fange eventuelle undtagelser.

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

Tjek, at det lykkedes:if (!$dbh) die('Unable to create PDO object'); .

Indstil derefter dette PDO-objekt til at rejse undtagelser $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); og ikke blot for at efterligne forberedte udsagn $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

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

Selvom din forespørgsel meget vel kan ændre sig dramatisk efter ovenstående råd, kan det stadig være nyttigt at vide, at du kan forkorte denne forespørgsel ved hjælp af MySQL's BETWEEN ... AND ... operator:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Du vil muligvis også finde din kode lettere at vedligeholde, hvis du bruger navngivne parametre i stedet for pladsholdere:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

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

Hvis du bruger navngivne pladsholdere, kan du bruge en associativ matrix som $params = array ( ':minlat' => $minlat, ... ); .

I begge tilfælde kan du binde værdier eller variable til dine parametre separat (hvilket er min foretrukne tilgang, da det nemt gør det muligt for en at køre forespørgslen igen med kun nogle parametre ændret):$q->bindParam(':minlat', $minlat); osv.

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

Tjek, at det lykkedes:if (!$doc) die('Unable to create DOMDocument object'); .

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

fetchAll() henter hele resultatsættet til PHP, hvilket kan kræve meget hukommelse, hvis resultatsættet er stort. Hvor man blot ønsker at iterere over hver post efter tur, er det normalt bedre at hente hver post efter behov:while ( $row = $q->fetch() ) .

  {

Denne bøjle (sammen med dens par nedenfor) er overflødig.

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

Hvor er din $d variabel erklæret/tildelt?

    $r->appendChild( $e );
  }

Som nævnt ovenfor er denne bøjle overflødig.

}
print $doc->saveXML();



  1. Sådan indstiller du tegnsættet og sorteringen af ​​en kolonne i MySQL

  2. Sådan får du et OBJECT_NAME() fra en anden database i SQL Server

  3. Ruby/PgSQL fejl ved Rails start:kan ikke indlæse en sådan fil -- pg_ext (LoadError)

  4. Dataanalyse vs. datavidenskab:Hvad er forskellen?