PHP PDO准备语句和值绑定提供无效的参数编号错误

时间:2012-04-20 22:54:58

标签: php mysql pdo

我在PHP PDO库和预处理语句方面遇到了一些问题。据我所知,下面的准备好的声明应该有效,但它没有,而是我得到:“PDOStatement :: execute():SQLSTATE [HY093]:无效的参数号:绑定变量的数量与令牌的数量不匹配”

本节的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()中包含的文本有什么问题。为了解决这个问题,我已经搜索了高低,并且今晚花了几个小时来修补代码,但无济于事。

我甚至尝试了这两个堆栈溢出主题中的建议,但它们也不起作用:

非常感谢任何帮助......

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

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

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

这类似于做这样的事情:

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

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

PolygonFromText(:polygonArea)

然后将其余字符串包含在绑定值中:

$sth->bindValue(':polygonArea', 'POLYGON((' . $polygon->getPolygonAsText() . '))', \PDO::PARAM_STR);

答案 2 :(得分: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(?)功能的那些单引号是狡猾的...通常你不引用方法调用吗?