我试图从ios获取纬度和经度坐标的输出(这工作正常),将其发送到php以使用MySQL进行查询,并让php将xml文档发送回ios(此步骤不起作用因为它拒绝从 mysql 读取上传的数据条目),然后在 iOS UItableview 上解析它(这也工作正常)。我试图让它与 XML 一起使用,因为在 iOS 上解析 xml 对我来说非常简单,并且我已经在其上运行了一个更简单的 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;
如果您要搜索地面某个范围内的记录,您将需要计算 great-circle distance ;您应该意识到,按照您当前的方法,0.1° 经度的距离会随着纬度的变化而变化,从两极的零距离到赤道的近 7 英里。
Google 在 Creating a Store Locator with PHP, MySQL & Google Maps 下编写了一份有用的指南:特别注意 Finding Locations with MySQL 部分和(在你的情况下)Outputting XML with PHP .
将其余代码放在一个或多个 try { ... }
block 中并捕获抛出的任何异常。
$dbh = new PDO('(censored personal information)');
检查是否成功:if (!$dbh) die('无法创建 PDO 对象');
。
然后设置此 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, ... );
。
无论哪种情况,您都可以分别将值或变量绑定(bind)到参数(这是我的首选方法,因为它可以轻松地使人们只需更改一些参数即可再次运行查询): $q->bindParam( ':minlat', $minlat);
等
$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
检查是否成功:if (!$doc) die('无法创建 DOMDocument 对象');
。
$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();
关于php 查询 iOS 纬度和经度不搜索附近的 mysql 纬度和经度并带有 xml 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870803/