2

我对 PHP PDO 库和准备好的语句有一点问题。据我所见,下面的准备好的语句应该可以工作,但它没有,而是我得到:“PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens” .

我本节的 PHP 代码如下所示:

    $sql = 'INSERT INTO '.POLYGON_TABLE.' (user_id, polygon, polygon_type) VALUES (:userId, PolygonFromText(\'POLYGON((:polygonArea))\'), :polygonType)';

    $sth = $this->pdo->prepare($sql);
    $sth->bindValue(':userId', $polygon->getUserId(), \PDO::PARAM_INT);
    $sth->bindValue(':polygonArea', $polygon->getPolygonAsText(), \PDO::PARAM_STR);
    $sth->bindValue(':polygonType', $polygon->getPolygonType(), \PDO::PARAM_STR);

    if($sth->execute()) {
        return true;
    } else {
        return false;
    }

我已经完成了 $polygon->getUserId()、$polygon->getPolygonAsText() 和 $polygon->getPolygonType() 的 var_dump 并得到以下信息:

    string(1) "1"
    string(226) "53.897910476098765 -1.739655277929728, 53.865530797116 -2.080231449804728, 53.67235280490181 -2.006073734960978, 53.68862047002787 -1.621552250585978, 53.89305512284903 -1.539154789648478, 53.897910476098765 -1.739655277929728"
    string(7) "commute"

问题在于 $polygon->getPolygonAsText() 注释掉这个特定的 bindValue 调用,并且 SQL 语句中的 PolygonFromText(\'POLYGON((:polygonArea))\') 会导致查询工作。

我现在完全不知所措。有人知道这里有什么问题吗?我看不出 $polygon->getPolygonAsText() 中包含的文本有什么问题。我已经到处寻找解决方案,今晚花了几个小时修补代码,但无济于事。

我什至尝试了这 2 个堆栈溢出主题中的建议,但它们也没有奏效:

任何帮助将非常感激...

4

3 回答 3

4

您是否尝试将整个表达式作为绑定值传递?

$sql = 'INSERT INTO '.POLYGON_TABLE.' (user_id, polygon, polygon_type) VALUES (:userId,  PolygonFromText(:polygonArea), :polygonType)';


$sth = $this->pdo->prepare($sql);
$area = sprintf("POLYGON((%s))", $polygon->getPolygonAsText()); 
$sth->bindValue(':userId', $polygon->getUserId(), \PDO::PARAM_INT);
$sth->bindValue(':polygonArea', $area, \PDO::PARAM_STR);
$sth->bindValue(':polygonType', $polygon->getPolygonType(), \PDO::PARAM_STR);
于 2012-04-20T23:04:43.823 回答
3

您似乎正在尝试在字符串中使用命名参数:

PolygonFromText(\'POLYGON((:polygonArea))\')

这类似于做这样的事情:

UPDATE foo SET bar = 'blah blah :wontwork blah blah'

您应该尝试的是在查询中绑定整个字符串:

PolygonFromText(:polygonArea)

然后在绑定值中包含字符串的其余部分:

$sth->bindValue(':polygonArea', 'POLYGON((' . $polygon->getPolygonAsText() . '))', \PDO::PARAM_STR);
于 2012-04-20T23:12:58.213 回答
1

最后的手段你可以这样做:

$sql = "INSERT INTO ".POLYGON_TABLE." (user_id, polygon, polygon_type) "
     ."VALUES (:userId, PolygonFromText('POLYGON(". $polygon->$getPolygonAsText
     .")'),:polygonType)";

但我认为你应该?先尝试参数,看看情况如何。

$sql = "INSERT INTO ".POLYGON_TABLE." (user_id, polygon, polygon_type) "
     ."VALUES (?, PolygonFromText('POLYGON(?)'), ?);";
$data = array($polygon->getUserId(), $polygon->getPolygonAsText(), $polygon->getPolygonType());
$query->execute($data);

顺便说一句,我也认为 POLYGON(?) 函数周围的那些单引号是狡猾的......通常你不引用方法调用吗?

于 2012-04-20T23:07:00.687 回答