我有一个 PDO 准备语句,其中绑定(bind)变量是在我们网站的高级搜索功能中动态准备的(它们可能因调用而异)。
我知道实际的 SQL 调用是正确的,但由于某种原因,我在尝试将我的字符串变量传递到准备好的语句时遇到以下错误:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
我以前遇到过这个错误,对正常的解决步骤非常熟悉。但是,我的情况很奇怪。使用以下示例代码:
$columns = "FirstName, LastName, ID, City, State";
$sWhere = "WHERE (FirstName LIKE ? AND LastName
LIKE ? AND ID LIKE ? AND City
LIKE ? AND State LIKE ?)";
$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'";
$sql = "SELECT ".$columns." FROM table ".$sWhere;
$stmt = $db->prepare($sql);
$stmt->execute(array($sVal));
其中 $sVal
的范围可以从“名字”、“姓氏”……到超过 12 个变量。改变变量的数量具有相同的结果。完整的声明是:
SELECT FirstName, LastName, ID, City, State
FROM table
WHERE (FirstName LIKE ? AND LastName
LIKE ? AND ID LIKE ? AND City
LIKE ? AND State LIKE ?)
当我按原样运行查询时,返回了上述错误。当我认为我确实有不正确数量的变量时,我在我的 $value 语句上运行了一个 ECHO,发现它们确实匹配。
作为二次测试,我从 $value 的回显中获取输出并直接插入回执行数组:
$stmt->execute(array('tom', 'lastname', '12345', 'Diego', 'CA'));
这对任何问题都有效。
它不会影响我的问题,但我还在 $sVal 变量中放置了 % 符号以确保正确性:
$sVal="'%tom%', '%lastname%', '%12345%', '%Diego%', '%CA%'";
对我来说,从零开始,SAME 变量的回显输出会起作用,但变量本身不会起作用。有什么想法吗?
最佳答案
你的 $sVal
不是一个数组,它只是一个简单的字符串,所以当你写 array($sVal)
时,execute()
只能看到一个值。
你需要 explode()你的 $sVal
字符串变成一个数组:
// clean up the unnecessary single quotes and spaces
$value = str_replace(array("'", ", "), array("", ","), $value);
// make the array of the values
$value = explode(',', $value);
$stmt->execute($value);
关于php - PDO 意外抛出具有多个绑定(bind)参数的绑定(bind)变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380976/