Я пытаюсь получить вывод координаты 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();