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

插入经纬度报insert input syntax is invalid for double precision type怎么解决

问题原因

报错insert input syntax is invalid for double precision type本质是PostgreSQL尝试将插入的内容转换为双精度浮点数时,识别到内容格式非法,常见诱因有三个:

  1. 前端传入的lon/lat携带非法字符(如前后空格、中文小数点、非数值符号、空值)
  2. 后端未对传入的经纬度做格式校验和类型转换,直接将原始字符串绑定到SQL
  3. 若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:39:03