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();