Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

truy vấn php cho vĩ độ và kinh độ iOS không tìm kiếm vĩ độ và vĩ độ mysql lân cận với đầu ra xml

Vì bạn là người mới làm quen với PHP, tôi nghĩ tôi sẽ ghi lại những quan sát của tôi về tập lệnh của bạn bằng cách xem qua từng dòng một:

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

Niềng răng ở đây là thừa. Bạn cũng có thể muốn thực hiện một số kiểm tra thông tin đầu vào (bao gồm cả việc các thông số đã được thiết lập hay chưa).

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

Nếu bạn đang tìm kiếm các bản ghi trong phạm vi nào đó trên mặt đất, bạn sẽ muốn tính toán khoảng cách vòng tròn lớn ; bạn nên biết rằng, với cách tiếp cận hiện tại của bạn, khoảng cách kinh độ 0,1 ° thay đổi theo vĩ độ của một người, từ bất kỳ khoảng cách nào ở các cực cho đến gần 7 dặm ở đường xích đạo.

Google đã viết một hướng dẫn hữu ích trong Tạo công cụ định vị cửa hàng bằng PHP, MySQL và Google Maps :đặc biệt chú ý đến phần Tìm vị trí với MySQL và (trong trường hợp của bạn) Xuất XML bằng PHP .

Đặt phần còn lại của mã vào một hoặc nhiều try { ... } khối và bắt bất kỳ ngoại lệ nào được đưa ra.

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

Kiểm tra xem nó đã thành công chưa:if (!$dbh) die('Unable to create PDO object'); .

Sau đó, đặt đối tượng PDO này để nâng cao ngoại lệ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); và không chỉ để mô phỏng các câu lệnh đã chuẩn bị sẵn $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); .

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

Mặc dù truy vấn của bạn có thể thay đổi đáng kể theo lời khuyên ở trên, nhưng vẫn có thể hữu ích khi biết rằng bạn có thể viết tắt truy vấn này bằng cách sử dụng MySQL's BETWEEN ... AND ... toán tử:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?) .

Bạn cũng có thể thấy mã của mình dễ bảo trì hơn nếu bạn sử dụng các tham số được đặt tên thay vì trình giữ chỗ:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon) .

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

Nếu sử dụng trình giữ chỗ được đặt tên, bạn có thể sử dụng một mảng kết hợp dưới dạng $params = array ( ':minlat' => $minlat, ... ); .

Trong cả hai trường hợp, bạn có thể liên kết các giá trị hoặc biến với các tham số của mình một cách riêng biệt (đó là cách tiếp cận ưa thích của tôi, vì nó dễ dàng cho phép một người chạy lại truy vấn với chỉ một số tham số được thay đổi):$q->bindParam(':minlat', $minlat); vv

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

Kiểm tra xem có thành công không:if (!$doc) die('Unable to create DOMDocument object'); .

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

fetchAll() tìm nạp toàn bộ tập kết quả vào PHP, điều này có thể yêu cầu nhiều bộ nhớ nếu tập kết quả lớn. Trong trường hợp người ta chỉ muốn lặp lại lần lượt từng bản ghi, thì thường tốt hơn là tìm nạp từng bản ghi theo yêu cầu:while ( $row = $q->fetch() ) .

  {

Dấu ngoặc nhọn này (cùng với cặp của nó bên dưới) là thừa.

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

$d của bạn ở đâu biến được khai báo / gán?

    $r->appendChild( $e );
  }

Như đã đề cập ở trên, nẹp này là thừa.

}
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. mysql cập nhật một cột với một int dựa trên thứ tự

  2. Chuyển một danh sách vào thủ tục lưu trữ MySQL và kiểm tra TẤT CẢ các giá trị hiện có

  3. Tạo bảng bị lỗi tràn số học

  4. tìm kiếm các sản phẩm mà khách hàng đã mua cùng nhau

  5. Ngoại lệ liên quan đến mysql thông qua jdbc