PDO意外地使用多个绑定参数抛出绑定变量错误

时间:2010-12-07 19:55:13

标签: php mysql pdo

我有一个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输出可以工作,但变量本身不会。有什么想法吗?

2 个答案:

答案 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);