Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

kueri php untuk lintang dan bujur iOS tidak mencari lintang dan bujur mysql terdekat dengan keluaran xml

Karena Anda baru mengenal PHP, saya pikir saya akan mencatat pengamatan saya pada skrip Anda dengan menelusurinya baris demi baris:

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

Kawat gigi di sini berlebihan. Anda mungkin juga ingin melakukan beberapa pemeriksaan kewarasan masukan (termasuk apakah parameter telah disetel sama sekali).

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

Jika Anda mencari untuk mencari catatan dalam beberapa rentang di lapangan, Anda akan ingin menghitung jarak lingkaran besar ; Anda harus menyadari bahwa, dengan pendekatan Anda saat ini, jarak 0,1° bujur bervariasi menurut garis lintang, dari tidak ada jarak apa pun di kutub hingga hampir 7 mil di khatulistiwa.

Google telah menulis panduan yang berguna di bawah Membuat Pencari Lokasi Toko dengan PHP, MySQL &Google Maps :berikan perhatian khusus pada bagian Menemukan Lokasi dengan MySQL dan (dalam kasus Anda) Mengeluarkan XML dengan PHP .

Tempatkan sisa kode dalam satu atau lebih try { ... } memblokir dan menangkap pengecualian apa pun yang dilemparkan.

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

Periksa apakah berhasil:if (!$dbh) die('Unable to create PDO object'); .

Kemudian setel objek PDO ini untuk memunculkan pengecualian $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); dan bukan hanya untuk meniru pernyataan yang disiapkan $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

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

Sementara kueri Anda mungkin berubah secara dramatis mengikuti saran di atas, mungkin masih berguna untuk mengetahui bahwa Anda dapat menyingkat kueri ini menggunakan BETWEEN ... AND ... operator:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Anda mungkin juga akan lebih mudah memelihara kode jika menggunakan parameter bernama daripada placeholder:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

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

Jika menggunakan placeholder bernama, Anda bisa menggunakan array asosiatif sebagai $params = array ( ':minlat' => $minlat, ... ); .

Dalam kedua kasus, Anda dapat mengikat nilai atau variabel ke parameter Anda secara terpisah (yang merupakan pendekatan pilihan saya, karena dengan mudah memungkinkan seseorang untuk menjalankan kueri lagi dengan hanya beberapa parameter yang diubah):$q->bindParam(':minlat', $minlat); dll.

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

Periksa apakah berhasil:if (!$doc) die('Unable to create DOMDocument object'); .

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

fetchAll() mengambil seluruh resultet ke dalam PHP, yang mungkin membutuhkan banyak memori jika resultet besar. Jika seseorang hanya ingin mengulang setiap record secara bergantian, biasanya lebih baik untuk mengambil setiap record sesuai kebutuhan:while ( $row = $q->fetch() ) .

  {

Penjepit ini (bersama dengan pasangannya di bawah) berlebihan.

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

Di mana $d . Anda variabel dideklarasikan/ditugaskan?

    $r->appendChild( $e );
  }

Seperti disebutkan di atas, penyangga ini berlebihan.

}
print $doc->saveXML();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. langkah akhir kueri sangat panjang pada waktu acak

  2. Apa cara termudah untuk menghapus database dari CLI dengan manage.py di Django?

  3. Perbedaan antara mysql &mysqli

  4. Pustaka MySQL C API untuk iPhone

  5. 5 Alat Pemantauan MySQL Teratas