插入经纬度报insert input syntax is invalid for double precision type怎么解决
问题原因
报错insert input syntax is invalid for double precision type本质是PostgreSQL尝试将插入的内容转换为双精度浮点数时,识别到内容格式非法,常见诱因有三个:
- 前端传入的
lon/lat携带非法字符(如前后空格、中文小数点、非数值符号、空值) - 后端未对传入的经纬度做格式校验和类型转换,直接将原始字符串绑定到SQL
- 若
geom字段为PostGIS的Point几何类型,直接传入WKT字符串无法被识别,需要用对应函数转换
解决步骤
1. 前端新增输入校验
提交前先校验经纬度格式,避免非法内容传到后端:
$(document).on("submit", "#form_interview", function (e) { e.preventDefault(); let lon = $("#lon").val().trim(); let lat = $("#lat").val().trim(); // 校验合法经纬度格式 if (!/^-?\d{1,3}(\.\d+)?$/.test(lon) || !/^-?\d{1,2}(\.\d+)?$/.test(lat)) { alert('请输入合法的经纬度'); return; } let data_Form = { lon: lon, lat: lat, geom:"point("+ lon +" "+ lat +")" } let url = "http://localhost:8077/know/validations/list.php?get=interview"; $.ajax({ type: "POST", url: url, data: data_Form, dataType: "json", async: true, error: function(res) { console.log(res.responseText) // 调试用,可打印后端返回的错误详情 } }) })
2. 后端优化逻辑
新增参数校验、类型转换,开启PDO异常模式方便定位问题,若geom是PostGIS几何类型需调用ST_GeomFromText转换:
// 开启PDO异常模式,输出完整错误信息 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 接收并清洗参数 $lon = isset($_POST['lon']) ? trim($_POST['lon']) : ''; $lat = isset($_POST['lat']) ? trim($_POST['lat']) : ''; $geom = isset($_POST['geom']) ? trim($_POST['geom']) : ''; // 校验参数合法性 if (!is_numeric($lon) || !is_numeric($lat)) { $return_array['code'] = 400; $return_array['msg'] = '经纬度格式错误'; echo json_encode($return_array); exit; } // 强制转换为浮点类型,确保格式符合double precision要求 $lon = (float)$lon; $lat = (float)$lat; try { // geom字段为PostGIS Point类型时,用ST_GeomFromText转换,第二个参数为坐标系SRID,常用WGS84为4326 // 若geom是普通字符串字段,去掉ST_GeomFromText即可 $set_interview = $conn->prepare("INSERT INTO datos(lon,lat,geom) VALUES (:lon,:lat, ST_GeomFromText(:geom, 4326))"); $set_interview->bindParam(':lon',$lon,PDO::PARAM_STR); $set_interview->bindParam(':lat',$lat,PDO::PARAM_STR); $set_interview->bindParam(':geom',$geom,PDO::PARAM_STR); $set_interview->execute(); $return_array['is_login']=true; echo json_encode($return_array); } catch(PDOException $e) { $return_array['code'] = 500; $return_array['msg'] = '操作失败:'.$e->getMessage(); echo json_encode($return_array); }
PDO本身没有专门的浮点数绑定常量,用PDO::PARAM_STR是正确的,只要绑定的内容本身是合法数值,PostgreSQL可以自动完成类型转换。
内容的提问来源于stack exchange,提问作者Ander Canales Medina
相关产品推荐
相关产品推荐

