gpt4 book ai didi

php - 尝试通过 pg_query_params 创建和回显数组

转载 作者:行者123 更新时间:2023-11-29 12:11:41 24 4
gpt4 key购买 nike

我使用过一些 Postgresql,但我还是个新手。我通常默认创建太多的查询并通过黑客攻击从查询中获得我需要的结果。这次我想写一些更精简的代码,因为我要处理一个大型数据库,代码需要尽可能简洁。

所以我有很多点数据,然后我有很多县。我有两个表,“县”和“ltg_data”(很多点)。我的目标是读取指定数量的县(在数组中给出)并确定每个县有多少分。我的新手、重复且低效的方法是编写如下查询:

$klamath_40_days = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname");
$klamath_rows = pg_num_rows($klamath_40_days);

如果我像上面那样为每个县运行一个单独的查询,它会给我很好的输出,但它是重复的并且效率低下。我宁愿使用循环。最后,我需要通过 URL 将参数传递到查询中。当我尝试在 PHP 中运行 for 循环时,出现“查询失败:错误:列“jackson”不存在”等错误。这是循环:

$counties = array ('Jackson', 'Klamath');

foreach ($counties as $i) {
echo "$i<br>";

$jackson_24 = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = ".$i." and time >= (NOW() - '40 DAY'::INTERVAL)");
$jackson_rows = pg_num_rows($result);

}

echo "$jackson_rows";

然后我研究了 PHP 中的 pg_query_params 特性,我认为这会有所帮助。但是我运行这个脚本:

$counties = array('Jackson', 'Josephine', 'Curry', 'Siskiyou', 'Modoc', 'Coos', 'Douglas', 'Klamath', 'Lake');

$query = "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = $1 and time >= (NOW() - '40 DAY'::INTERVAL)";

$result = pg_query_params($conn, $query, $counties);

我收到此错误:查询失败:错误:绑定(bind)消息提供 9 个参数,但准备语句“”需要 1 个在

所以我基本上想知道将参数(可能是来自 URL 的单个参数或数组中的多个元素)传递给 postgresql 查询的最佳方法是什么?然后我想以有条理的方式呼应总结结果。

感谢您对此的任何帮助。

最佳答案

如果您只需要知道有多少点落入数组中指定的每个县,那么您可以在对数据库的一次调用中执行以下操作:

SELECT countyname, count(*)
FROM counties
JOIN ltg_data ON ST_contains(counties.the_geom, ltg_data.ltg_geom)
WHERE countyname = ANY ($counties)
AND time >= now() - interval '40 days'
GROUP BY countyname;

这比单独调用要高效得多,而且您只返回一个县名实例,而不是为检索到的每条记录返回一个实例。如果您在国家 Klamath 中有 1,000 分,那么您只返回字符串“Klamath”一次,而不是 1,000 次。此外,php 不必计算查询结果的长度。总而言之,更清洁、更快速。

另请注意 JOIN 语法与 PostGIS 函数调用的结合。

关于php - 尝试通过 pg_query_params 创建和回显数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com