sql >> Databáze >  >> RDS >> Mysql

php dotaz na zeměpisnou šířku a délku iOS nevyhledává poblíž mysql lat a lon s výstupem xml

Protože jste v PHP nováčkem, myslel jsem, že zaznamenám svá pozorování k vašemu skriptu tak, že jej projdu řádek po řádku:

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

Rovnátka jsou zde nadbytečná. Můžete také chtít provést některé vstupní kontroly zdravého rozumu (včetně toho, zda byly parametry vůbec nastaveny).

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

Pokud chcete hledat záznamy v určitém rozsahu na zemi, budete chtít vypočítat vzdálenost velkého kruhu ; měli byste si být vědomi toho, že při vašem současném přiblížení se vzdálenost 0,1° zeměpisné délky mění v závislosti na zeměpisné šířce, od žádné vzdálenosti na pólech až po téměř 7 mil na rovníku.

Společnost Google sepsala užitečného průvodce v části Vytvoření vyhledávače obchodů pomocí PHP, MySQL a Map Google :věnujte zvláštní pozornost sekci Vyhledání umístění pomocí MySQL a (ve vašem případě) Výstup XML pomocí PHP .

Umístěte zbytek kódu do jednoho nebo více try { ... } blokuje a zachytí všechny vyvolané výjimky.

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

Zkontrolujte, zda se to podařilo:if (!$dbh) die('Unable to create PDO object'); .

Potom nastavte tento objekt PDO tak, aby vyvolal výjimky $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); a nejen k emulaci připravených příkazů $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

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

I když se váš dotaz může podle výše uvedených rad dramaticky změnit, stále může být užitečné vědět, že tento dotaz můžete zkrátit pomocí BETWEEN ... AND ... operátor:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Také pro vás může být snadnější údržba, pokud místo zástupných symbolů použijete pojmenované parametry:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

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

Pokud používáte pojmenované zástupné symboly, můžete použít asociativní pole jako $params = array ( ':minlat' => $minlat, ... ); .

V obou případech byste mohli hodnoty nebo proměnné svázat se svými parametry samostatně (což je můj preferovaný přístup, protože to snadno umožňuje spustit dotaz znovu s pouze některými změněnými parametry):$q->bindParam(':minlat', $minlat); atd.

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

Zkontrolujte, zda se to podařilo:if (!$doc) die('Unable to create DOMDocument object'); .

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

fetchAll() načte celou sadu výsledků do PHP, což může vyžadovat hodně paměti, pokud je sada výsledků velká. Pokud si člověk přeje pouze iterovat každý záznam postupně, je obvykle lepší načíst každý záznam podle potřeby:while ( $row = $q->fetch() ) .

  {

Tato ortéza (spolu s párem níže) je nadbytečná.

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

Kde je váš $d proměnná deklarována/přiřazena?

    $r->appendChild( $e );
  }

Jak bylo uvedeno výše, tato ortéza je nadbytečná.

}
print $doc->saveXML();



  1. Jak získat přístup k objektu RowDataPacket

  2. Django a postgresql schémata

  3. Jak monitorovat prostor MySQL?

  4. Jak MariaDB dosahuje globálního měřítka s Xpand