php-запрос для широты и долготы iOS не ищет близлежащие mysql lat и lon с выводом xml

Я пытаюсь получить вывод координаты lat и lon из ios (это работает нормально), отправьте его на php для запроса в MySQL и попросите PHP передать XML-документ обратно в ios (этот шаг не работает, потому что он отказываясь читать загруженную запись данных из mysql), а затем разбирает ее в iOS UItableview (это тоже отлично работает). Я пытаюсь заставить это работать с XML, потому что синтаксический анализ xml на iOS для меня очень прост, и у меня есть более простой скрипт xml, который уже работает на нем, но, вероятно, из-за ошибок с неопытности в php, я не могу получить этот php-скрипт за работой. Что я делаю неправильно в своем php-скрипте? Благодаря!

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

Поскольку вы новичок в PHP, мне показалось, что я записываю свои наблюдения на ваш скрипт, прогуливаясь по нему по очереди:

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

Скобки здесь лишние. Возможно, вы также захотите выполнить некоторые проверки на доступность (включая параметры, которые были установлены вообще).

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

Если вы ищете поиск записей в определенном диапазоне на земле, вам нужно вычислить расстояние между большими кругами ; вы должны знать, что с вашим текущим подходом расстояние 0,1 ° долготы колеблется в зависимости от широты, от какого-либо расстояния от полюсов до почти 7 миль на экваторе.

Google написал полезное руководство в разделе « Создание локатора хранилища с PHP, MySQL и Google Maps» : обратите особое внимание на раздел « Поиск местоположений с MySQL» и (в вашем случае). Вывод XML с помощью 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, что может потребовать много памяти, если набор результатов большой. Если вы хотите просто перебирать каждую запись по очереди, обычно лучше извлекать каждую запись по мере необходимости: while ( $row = $q->fetch() ) .

  { 

Эта скобка (вместе с ее парой ниже) является излишней.

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

Где ваша объявленная / назначенная переменная $d ?

  $r->appendChild( $e ); } 

Как упоминалось выше, эта скобка является излишней.

 } print $doc->saveXML();