如何使用PDO bindParam将点数据插入到mysql中?

时间:2013-07-27 02:33:33

标签: php mysql pdo gis

详情

我想利用mysql的空间扩展,所以我试图使用bindParam将经度和纬度存储在数据类型POINT的mysql表中。 不幸的是,我一直收到错误SQLSTATE [23000]:完整性约束违规:1048列'location'不能为空。

我已经检查过经度和纬度都有值。所以问题必须与我的代码有关,但我看不出我做错了什么。

这是我正在使用的代码。

$location=$latitude." ".$longitude;
$sql = "INSERT INTO my_geodata SET location = PointFromText('POINT(:location)')";
      //INSERT INTO my_geodata SET location = PointFromText('POINT(-41 12)');    

try 
{
    $stmt = $dbh->prepare($sql);            
    $stmt->bindParam(':location', $location, PDO::PARAM_STR);           
    $stmt->execute();   
    $dbh = null;
}

catch(PDOException $e)
{               
    echo $error=$e->getMessage();
}

问题

我做错了什么?如何将经度和纬度插入到具有PDO和bindParam的mysql表(使用POINT数据类型)中?

变化

根据AgreeOrNot的回答,实现这一目标的方法略有不同

$location = 'POINT(' . $latitude . " " . $longitude . ')';    
$sql = "INSERT INTO my_geodata (location) VALUES (PointFromText(:location))";

2 个答案:

答案 0 :(得分:4)

请注意,参数化查询不是(简单)字符串替换。在您的代码中,您的查询参数将放在一个不受影响的字符串文字中。

试试这个:

$location = 'POINT(' . $latitude . " " . $longitude . ')';
$sql = "INSERT INTO my_geodata SET location = PointFromText(:location)";

答案 1 :(得分:1)

空间扩展不是为纬度和经度设计的,它们是为笛卡尔坐标设计的。距离函数没有考虑地球的曲率,所以总是给出错误的结果。很遗憾,我知道......