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

PostGIS数据库保存多边形JSON坐标时PHP语法错误修正请求

修复PHP向PostGIS插入多边形JSON坐标的语法错误

首先看你遇到的Parse error: syntax error, unexpected '$success' (T_VARIABLE)错误,最直接的原因是**$query语句末尾缺少分号**,PHP解析器没办法正确区分语句边界,所以把后面的$success当成了$query的一部分,导致报错。

不过除了这个语法问题,你的GeoJSON拼接逻辑也有问题,会导致PostGIS无法正确解析坐标。我帮你一步步修正:

1. 补上缺失的分号

在你的代码里,$query这一行的结尾没有加;,这是语法错误的根源:

// 原错误代码
$query = "INSERT INTO table_name (column_name) VALUES (ST_SetSRID(ST_GeomFromGeoJSON ('{ ['".($coordinates) ."'] }'), 4326))" 
// 这里缺少分号!
$success = pg_query($conn,$query);

2. 修正GeoJSON拼接逻辑

你传入的Coordinates已经是完整的GeoJSON字符串了:

{"type":"polygon","coordinates":[[[-97.53662109375,43.67581809328341],[-98.096923828125,42.60970621339408],[-96.427001953125,42.924251753870685],[-97.53662109375,43.67581809328341]]]}

但你手动拼接了{ ['".($coordinates) ."'] },这会生成无效的JSON格式,PostGIS的ST_GeomFromGeoJSON函数根本无法解析。直接使用原始的$coordinates即可。

3. 推荐使用参数化查询(避免SQL注入)

直接拼接用户输入到SQL语句里存在严重的SQL注入风险,强烈建议用PostgreSQL的参数化查询来处理。

最终修正后的代码

// 获取POST参数,注意做基本的合法性检查
$coordinates = $_POST['Coordinates'] ?? '';
if (empty($coordinates)) {
    // 处理参数为空的情况
    die('Coordinates参数不能为空');
}

// 方案1:修复语法和拼接问题的基础版本(仍有注入风险)
$query = "INSERT INTO table_name (column_name) VALUES (ST_SetSRID(ST_GeomFromGeoJSON('$coordinates'), 4326));";
$success = pg_query($conn, $query);

// 方案2:更安全的参数化查询版本(推荐)
$stmt = pg_prepare($conn, "insert_polygon", "INSERT INTO table_name (column_name) VALUES (ST_SetSRID(ST_GeomFromGeoJSON($1), 4326));");
$success = pg_execute($conn, "insert_polygon", array($coordinates));

// 执行结果检查
if ($success) {
    echo "多边形坐标插入成功";
} else {
    echo "插入失败:" . pg_last_error($conn);
}

额外说明

  • 确保你的PostGIS版本支持ST_GeomFromGeoJSON函数(PostGIS 2.0及以上版本都支持)
  • 表中的column_name字段类型应该是GEOMETRY(POLYGON, 4326)或者GEOGRAPHY(POLYGON, 4326),这样和你设置的SRID 4326匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:37:06