Я пытаюсь получить вывод координаты lat и lon из ios (это работает нормально), отправьте его на php для запроса в MySQL и попросите PHP отправить XML-документ обратно в ios (этот шаг не работает, потому что он не возвращая запись mysql в этом месте), а затем разобрав ее в iOS UItableview (это тоже отлично работает). Я пытаюсь заставить это работать с XML, потому что у меня есть более простой скрипт xml, уже запущенный на нем. Но, вероятно, из-за ошибок с неопытности в php, я не могу заставить этот скрипт работать! Что я делаю неправильно в своем php-скрипте? Благодаря! О, а также категории данных в mysql состоят из «lon» и «lat» и «name» (для имени близкого друга или семьи)! И в случае, если кто-то задавался вопросом, это эволюционированная версия более раннего скрипта (который также давал те же результаты): php-запрос для широты и долготы iOS, не выполняющий поиск ближайших mysql lat и lon с выводом xml
<?php define( 'LATMILES', 1 / 69 ); define( 'LONMILES', 1 / 53 ); if ( isset( $_GET['lat'] ) ) { $lat = (float)$_GET['lat']; } //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""]; if ( isset( $_GET['lon'] ) ) { $lon = (float)$_GET['lon']; } //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""]; if ( isset( $_GET['radius'] ) ) { $radius = (float)$_GET['radius']; } //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""]; $minlat = $lat - ( $radius * LATMILES ); $minlon = $lon - ( $radius * LONMILES ); $maxlat = $lat + ( $radius * LATMILES ); $maxlon = $lon + ( $radius * LONMILES ); $dbh = new PDO('(censored private information'); $sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?'; $params = array( $minlat, $maxlat, $minlon, $maxlon ); if ( isset( $_GET['q'] ) ) { $sql .= " AND name LIKE ?"; $params []= '%'.$_GET['q'].'%'; } $q = $dbh->prepare( $sql ); $q->execute( $params ); $doc = new DOMDocument(); $r = $doc->createElement( "locations" ); $doc->appendChild( $r ); foreach ( $q->fetchAll() as $row) { $dlat = ( (float)$row['lat'] - $lat ) / LATMILES; $dlon = ( (float)$row['lon'] - $lon ) / LONMILES; $d = sqrt( ( $dlat * $dlat ) + ( $dlon * $dlon ) ); if ( $d <= $radius ) { $e = $doc->createElement( "location" ); $e->setAttribute( 'lat', $row['lat'] ); $e->setAttribute( 'lon', $row['lon'] ); $e->setAttribute( 'name', $row['name'] ); $r->appendChild( $e ); } } print $doc->saveXML(); ?>
Ваш код сложнее. Для начала наилучшим решением для поиска местоположения является использование Haversine_formula .
Я упростил ваш код, чтобы использовать его.
<?php if (isset( $_GET['lat'])){ $lat = (float)$_GET['lat']; } if ( isset( $_GET['lon'])){ $lon = (float)$_GET['lon']; } if ( isset( $_GET['radius'])){ $radius = (float)$_GET['radius']; } if ( isset( $_GET['q'])){ $name = $_GET['q']; } $dbh = new PDO('(censored private information'); // $sql = "SELECT name, lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat) ) * cos( radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lon) ) ) ) AS distance FROM location WHERE `name` LIKE '%s' HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20", mysql_real_escape_string($lat), mysql_real_escape_string($lon), mysql_real_escape_string($lat), mysql_real_escape_string($name), mysql_real_escape_string($radius)); $q = $dbh->prepare( $sql ); $q->execute( $params ); $doc = new DOMDocument(); $r = $doc->createElement( "locations" ); $doc->appendChild( $r ); foreach ( $q->fetchAll() as $row) { //$dlat = ( (float)$row['lat'] - $lat ) / LATMILES; //$dlon = ( (float)$row['lon'] - $lon ) / LONMILES; //]$d = sqrt( ( $dlat * $dlat ) + ( $dlon * $dlon ) ); //if ( $d <= $radius ) { $e = $doc->createElement( "location" ); $e->setAttribute( 'lat', $row['lat'] ); $e->setAttribute( 'lon', $row['lon'] ); $e->setAttribute( 'name', $row['name'] ); $r->appendChild( $e ); //} } echo $doc->saveXML(); ?>
Я прокомментировал некоторые из вашего кода, поскольку я не думаю, что это требуется.
Я также изменил print $doc->saveXML();
echo $doc->saveXML();
Я также попытался бы жестко кодировать параметры, т.е. $lat =55.00;
и т. д., чтобы обеспечить требуемый выход.
Формула выше i sin миль для изменения в км использует 6371 вместо 3959