php 查询 iOS 纬度和经度不搜索附近的 mysql 纬度和经度并带有 xml 输出

标签 php mysql xml

我试图从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/

相关文章:

php - 如何使用 Laravel 5 和文件系统将大(视频)文件上传到 AWS S3?

php数据库问题

java - 如何在按下按钮时更改按钮背景并在停止按下后继续更改?

c# - 尽管进行了编码,XML 解析器仍卡在特殊字符上

php - 从 HHVM C++ 扩展运行 PHP 函数

php - 以编程方式在 WooCommerce 中创建多个优惠券

MySQL对列的元素求和

mysql - 存储值列表(例如兴趣)

php - mysql_fetch_array 只运行一次,应该是 6

jquery - 如何找出页面已加载的百分比以更新 jQuery UI 进度条?