我在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()中包含的文本有什么问题。为了解决这个问题,我已经搜索了高低,并且今晚花了几个小时来修补代码,但无济于事。
我甚至尝试了这两个堆栈溢出主题中的建议,但它们也不起作用:
非常感谢任何帮助......
答案 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(?)功能的那些单引号是狡猾的...通常你不引用方法调用吗?