我有一个PDO预处理语句,其中绑定变量是在我们网站上的高级搜索功能中动态准备的(它们可能因呼叫而异)。
我知道实际的SQL调用是正确的但由于某种原因,我在尝试将字符串变量传递到预准备语句时遇到以下错误:
SQLSTATE [HY093]:参数无效 number:绑定变量的数量 不匹配令牌数量
之前我遇到过此错误,并且非常熟悉正常的解决步骤。但是,我的情况很奇怪。使用以下示例代码:
$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
的范围可以从'firstname','lastname'....到超过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的echo中获取输出并直接插回到execute数组中:
$stmt->execute(array('tom', 'lastname', '12345', 'Diego', 'CA'));
这适用于任何问题。
它不会影响我的问题,但我也在我的$ sVal变量中放置%符号以确保正确性:
$ sVal =“'%tom%','%lastname%','%12345%','%Diego%','%CA%'”;
这使得ZERO对我来说SAME变量的echo'd输出可以工作,但变量本身不会。有什么想法吗?
答案 0 :(得分:3)
您的$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);
答案 1 :(得分:1)
问题是execute
接受一系列参数,每个参数都有自己的密钥。传递类似SQL的逗号分隔字符串将无法正常工作,即使这样做,也会导致PDO无效。
这是错误的:
$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'";
这是应该如何完成的:
$sVal = array('tom', 'lastname', '12345', 'Diego', 'CA');
例如,如果您在POST中从表单接收数据,那么它将是:
$sVal = array(
$_POST['firstname'],
$_POST['lastname'],
$_POST['zipcode'],
$_POST['city'],
$_POST['state'],
);
$stmt->execute($sVal);