【问题标题】:php query for iOS latitude and longitude not searching for nearby mysql lat and lon with a xml outputphp查询iOS纬度和经度不使用xml输出搜索附近的mysql lat和lon
【发布时间】:2012-10-13 16:04:36
【问题描述】:

我正在尝试从 ios 获取 lat 和 lon 坐标的输出(这工作正常),将其发送到 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 mysql xml


【解决方案1】:

由于您是 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 { ... } 块中并捕获任何抛出的异常。

$dbh = new PDO('(censored personal information)');

检查是否成功:if (!$dbh) die('Unable to create PDO object');

然后将此 PDO 对象设置为引发异常 $dbh-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 而不仅仅是模拟准备好的语句 $dbh-&gt;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' =&gt; $minlat, ... );

在任何一种情况下,您都可以将值或变量分别绑定到您的参数(这是我的首选方法,因为它很容易让一个人在只更改一些参数的情况下再次运行查询):$q-&gt;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-&gt;fetch() )

  {

这个大括号(连同下面的一对)是多余的。

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

您的 $d 变量声明/分配在哪里?

    $r->appendChild( $e );
  }

如上所述,这个大括号是多余的。

}
print $doc->saveXML();

【讨论】:

  • 非常感谢您的建议!我会做出改变的!哦,我在浏览器中(或在 ios 设备上)没有得到任何回复您上面的评论。
  • 嗯...我进行了更改,例如不必要的内容、删除了未声明的、已编辑的 cmets 等,但我的主机已关闭...当它消失时,我将不得不回复您备份。
  • 嘿。感谢您对这些指针和链接如此有帮助。但是我的 iPhone 上的结果仍然为空……浏览器中的结果为空。我查看了谷歌示例,它看起来有点像我的。因此,我创建了该文档的副本,并根据该 google 链接进行了一些调整,但我仍然得到相同的结果。你可以在这里查看这些调整,但我也有这个 php 文件以防万一:stackoverflow.com/questions/12878590/…
  • 抱歉,这是指向新 php 文件的链接:stackoverflow.com/questions/12879484/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多