You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中pg_fetch_array仅返回第一行结果(PostGIS空间相交查询场景)

核心原因

pg_fetch_array函数单次调用仅会从查询结果集中读取一行数据,同时将结果指针后移一位。你原代码中仅调用了一次pg_fetch_array,所以无论查询返回多少行结果,都只能拿到默认排序下的第一行数据。

数据更新前你的逻辑看起来运行正常,是因为当时zona_bahaya表的默认排序下第一行刚好是和坐标点相交的记录,返回的intersek值为t,in_array判断可以命中。数据更新后表的默认排序发生变化,第一行变成了不相交的记录,返回值为f,就出现了不符合预期的情况。

优化方案

你当前添加order by intersek desc的临时方案可以解决问题,另外还有两种更稳妥的实现方式:

  • 代码层遍历所有结果:循环调用pg_fetch_array读取所有返回行,只要存在任意一行intersek值为t,就执行相交逻辑,无需修改SQL语句
  • SQL层直接返回聚合结果:调整查询语句直接判断是否存在相交的多边形,无需处理多行结果,性能更优,参考实现如下:
$sql1 = "SELECT EXISTS(
            SELECT 1 FROM zona_bahaya 
            WHERE ST_Intersects(ST_SetSRID(ST_Point($startlng, $startlat), 4326), geom)
        ) as is_intersect";
$query1 = pg_query($conn, $sql1);
$check_location = pg_fetch_array($query1);
if ($check_location['is_intersect'] == 't') {
    // 执行相交后的逻辑
} else {
    // 执行不相交的逻辑
}

内容的提问来源于stack exchange,提问作者astaga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:12:03