2012-10-13 80 views
0

我想從ios(這是工作正常)得到拉和lon座標的輸出,發送到PHP查詢與MySQL和PHP發出一個XML文件回ios(這一步不工作,因爲它拒絕從MySQL讀取上傳的數據項),然後解析它在iOS UItableview(這也工作得很好)。我試圖讓這個與XML一起工作,因爲在iOS上解析xml對我來說非常簡單,我已經獲得了一個更簡單的xml腳本,但是可能是因爲缺乏經驗的錯誤,我無法獲得這個php腳本加工。我在我的PHP腳本中做錯了什麼?謝謝!php查詢爲iOS經度和緯度不搜索附近的MySQL經緯度和一個xml輸出

<?php 
{ $lat = (float)$_GET['lat']; } //ios get "lat" value from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g", latitude, longitude]; 
{ $lon = (float)$_GET['lon']; } //ios get "lon" value from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g", latitude, longitude]; 
$minlat = $lat-.1; 
$maxlat = $lat+.1; 
$minlon = $lon-.1; 
$maxlon = $lon+.1; 
$dbh = new PDO('(censored personal information)'); 
$sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?'; 
$params = array($minlat, $maxlat, $minlon, $maxlon); 
$q = $dbh->prepare($sql); 
$q->execute($params); 
$doc = new DOMDocument(); 
$r = $doc->createElement("locations"); 
$doc->appendChild($r); 
foreach ($q->fetchAll() as $row) { 
    { 
    $e = $doc->createElement("location"); 
    $e->setAttribute('name', $row['name']); 
    $e->setAttribute('d', $d); 
    $r->appendChild($e); 
    } 
} 
print $doc->saveXML(); 
?> 
+0

啊。忘了刪除它。謝謝。但仍不能解決問題 – user1667601

+0

你會收到什麼輸出?有沒有錯誤? XML與你的期望有什麼不同?嘗試使用適當的GET參數訪問瀏覽器中的網頁。 – eggyal

+0

可能的重複[問題與PHP不匹配從iOS與MySQL數據輸入的lon和緯度](http://stackoverflow.com/questions/12870967/issue-with-php-not-matching-lon-and-lat-從-ios-with-a-mysql-data-entry) – Trott

回答

2

因爲你是新來的PHP,我想我會通過它走行由行記錄我對你的腳本意見:

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

的這裏括號是多餘的。您可能還希望執行一些輸入健全性檢查(包括是否設置參數)。

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

如果你正在尋找到地面上的某些範圍內搜索記錄,你會想計算great-circle distance;您應該意識到,按照您目前的方法,經度的距離會隨着緯度而變化,從極點到赤道幾乎不到7英里。

谷歌寫了一個有用的指導下Creating a Store Locator with PHP, MySQL & Google Maps:特別注意關於Finding Locations with MySQL和(在你的情況下)Outputting XML with PHP部分。

將其餘代碼放在一個或多個try { ... }塊中,並捕獲拋出的任何異常。

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

檢查成功:if (!$dbh) die('Unable to create PDO object');

然後設置此PDO對象以引發異常$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,而不僅僅是模擬準備的語句$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

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

雖然您的查詢可能極大地改變上述繼建議,它可能仍然是有用的知道,你可以使用MySQL的BETWEEN ... AND ...運營縮寫此查詢:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)

如果您使用命名參數代替佔位符,則可能會發現代碼更容易維護:WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)

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

如果使用指定的佔位符,你可以使用關聯數組爲$params = array (':minlat' => $minlat, ...);

在這兩種情況下,你可以綁定值或變量單獨的參數(這是我的首選方法,因爲它很容易使人們能夠再次運行查詢,只有一些參數變化):$q->bindParam(':minlat', $minlat);

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

檢查成功:if (!$doc) die('Unable to create DOMDocument object');

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

fetchAll()獲取整個結果到PHP,這可能需要大量的內存如果ResultSet是很大的。如果只希望依次迭代每條記錄,通常最好根據需要獲取每條記錄:while ($row = $q->fetch())

{ 

此支架(連同其下面的一對)是多餘的。

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

您的$d變量在哪裏申明/分配?

$r->appendChild($e); 
    } 

如上所述,此支架是多餘的。

} 
print $doc->saveXML(); 
+0

非常感謝你的建議!我會做出改變!哦,而且我在瀏覽器(或iOS設備)上沒有收到任何回覆您上面的評論。 – user1667601

+0

嗯......我做了修改,比如unistaries,刪除了未聲明的,編輯過的評論等等,但是我的主機已關閉......當它恢復時,我將不得不回覆你。 – user1667601

+0

嘿。感謝您對這些指針和鏈接的幫助。但是我仍然在iPhone上得到空的結果......並且在瀏覽器中顯示空結果。我查看了谷歌的例子,它看起來像我的。所以我創建了該文檔的副本,並根據該Google鏈接進行了一些調整,但仍得到相同的結果。你可以在這裏查看這些調整,但我也有這個PHP文件,以防萬一:http://stackoverflow.com/questions/12878590/php-not-matching-lon-and-lat-from-ios-with-a -lon-and-lat-mysql-data-entry – user1667601