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
相关产品推荐
相关产品推荐

