1

可能重复:
如何防止 PHP 中的 SQL 注入?
从 MySQL 数据库中选择不同的行

嗨,我有一个 phonegap 应用程序,当检测到路面变形(例如坑洼和减速带)时,它会存储纬度、经度、地址和严重程度。

到目前为止,通过 PHP PDO 将这些保存在数据库中根本不是问题。PDO 的设计方式是,如果被报告的坑洞已经被报告了 10 次(检查数据库中 15 米范围内的任何条目),则不会被报告(即再次插入数据库中)。此外,加载表面变形也不是问题,我使用 Haversine 公式来执行此操作,其中我传递用户的纬度和经度并获得一定距离内的值。

$stmt = $dbh->prepare("
  SELECT
    lat, lng,
    ( 6378160 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance
  FROM myTable
  HAVING distance > 0 
  ORDER BY distance
  LIMIT 0 , 30
");

我遇到的问题是,由于可以报告 10 次相同的坑洼,我最终会将相同的坑洼报告给应用程序以在地图上绘制 10 次。我需要做的是,获取距离用户一定距离内的坑洞列表(使用haversine公式完成),然后从这个列表中过滤坑洞,以便我只得到不同的坑洞而不是相同的坑洞坑洼被退回10次。任何人都知道如何进行这种过滤?谁能告诉我如何在 PHP/PDO 中做到这一点,或者如果可以的话,请给我一些类似的教程?

这是我需要做的简要说明:假设我在坑洼 A 和坑洼 B 附近,并说我在数据库中有 6 个坑洼 A 的报告和 8 个坑洼 B 的报告(等等)。通过使用harsine 公式,我得到了坑洞A 和坑洞B 的所有报告值(即14 个结果)。我需要的是获得坑洼 A 报告的中点和坑洼 B 报告的中点(使用:http ://www.geomidpoint.com/calculation.html )并返回 2 个结果(一个用于 A 和一个用于 B)而不是 14 个结果。

4

2 回答 2

1

您必须将坑洼和报告分开。首先查询周围有哪些坑洞GROUP BY lat, lng,然后使用 查询每个坑洞的报告LIMIT 1

$rows = dbh_query("SELECT id FROM ... ");
foreach ($rows as $row)
{
    dbh_query("SELECT ... WHERE id = :id LIMIT 1", array('id' => $row['id']));
}
于 2013-01-02T11:44:58.090 回答
0

我认为您有 2 个选项可以详细说明。不幸的是,两者都意味着一些并发症。

1)不要写多个观察,你应该总是在写作时对它们进行聚类。例如,如果您支持 10 米的空间粒度,那么每次到达距离现有记录不到 10 米的新测量值时,您不会添加新的坑洞,而是更改平均值(纬度、经度、计数器)最近的现有记录。这样,您将在示例中得到 2 条坑洼 A 和 B 记录,因此您可以使用DISTINCT查询。

2)对于每个请求,您可以从现有表中获取 15 米范围内的所有记录,并在其上创建一个临时表,用于计算沿路斧的概率密度函数。同样,这需要选择一个可以在ROUND函数中模拟为小数精度的粒度。例如,如果你有一个存储函数来计算当前点和现有记录之间的距离,你可以写:

INSERT INTO `temppdf` (dist, pothole_id)
SELECT FROM `maintable`
ROUND(distance(@current_lat, @current_lon, maintable.lat, maintable.lon), -1), pothole_id
WHERE distance(@current_lat, @current_lon, maintable.lat, maintable.lon) < 15;

然后,您可以在 temppdf 中查询每个坑洞具有最大计数器的行,如下所示:

SELECT pothole, MAX(cnt) as `peak` FROM
(SELECT DISTINCT pothole, COUNT(dist) as cnt FROM `temppdf` GROUP BY pothole, dist) as `subq`
GROUP BY pothole;

结果是计数器大于阈值的坑洼。

于 2013-01-02T12:38:27.757 回答