【问题标题】:Can I do a Parameterized Query containing Geometry Function?我可以执行包含几何函数的参数化查询吗?
【发布时间】:2011-12-02 10:35:16
【问题描述】:

我有一个如下所示的 SQL 查询:

$stmt = $dbh->prepare("INSERT INTO Places (name, latlng)
 VALUES (?, GeomFromText('POINT(? ?)'))");
$stmt->bindValue(1, $_POST['name']);
$stmt->bindValue(2, $_POST['lat']);
$stmt->bindValue(3, $_POST['lng']);
$stmt->execute();

我收到了这个错误:

带有消息“SQLSTATE[23000]”的“PDOException”:完整性约束 违规:1048 列 'latlng' 不能为空'

latlng 列的类型为 point NOT NULL。由于插入适用于以下内容,为什么会导致为上述内容插入NULL

"INSERT INTO Places (name, latlng)
 VALUES (?, GeomFromText('POINT(".$_POST['lat']." ".$_POST['lng'].")'))"

所以,我的问题是,我可以做一个包含几何函数的参数化查询吗?如果是这样,怎么做?如果不是,为什么?

【问题讨论】:

  • 我的猜测是您必须将整个 '$lat, $lon' 作为值提供给它,但我可能是错误的
  • @Pekka,但为什么它在第一种情况下不起作用?
  • @Pekka,我试过了,但是没用。
  • 我不确定,因为我从未使用过几何函数,但我认为这里的 'POINT(? ?)' 只是一个字符串,而不是一个函数。您不能只对字符串的一部分进行参数化,您需要对整个字符串进行参数化。 dbh->prepare("INSERT INTO Places (name, latlng) VALUES (?, GeomFromText(?))"); $stmt->bindValue(1, $_POST['name']); $stmt->bindValue(2, 'POINT('.(float)$_POST['lat'].' '.(float)$_POST['lng'].')');应该工作并且应该是安全的。
  • @XzKto:是的,我认为你的解释是正确的。你的解决方案也有效。你能把它写下来作为答案,这样我就可以给你信用。谢谢:)

标签: php mysql pdo geospatial


【解决方案1】:

在您的查询中,POINT(? ?) 只是一个字符串,而不是一个函数。您不能只对字符串的一部分进行参数化,您需要对整个字符串进行参数化:

$stmt = dbh->prepare("INSERT INTO Places (name, latlng) VALUES (?, GeomFromText(?))");
$stmt->bindValue(1, $_POST['name']);
$stmt->bindValue(2, 'POINT('.(float)$_POST['lat'].' '.(float)$_POST['lng'].')');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 2023-02-25
    • 2021-06-14
    • 1970-01-01
    • 2021-03-30
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多