php pdo绑定多个值问题

时间:2012-10-12 11:03:41

标签: php mysql pdo

我在php中有以下代码,用于根据客户端发送的数组查询数据库。

$limit = $_POST['limit'];
$userArray = json_decode($_POST['arr'], true);
$queryPlaceholders= implode(',', array_fill(0,count($userArray), '?'));
$stmt = $db->prepare("SELECT * FROM tableA
                          WHERE tableA.id IN (".$queryPlaceholders.")
                          LIMIT ?");
foreach($userArray as $k => $val){
    $stmt->bindParam(($k+1), $val);
}
$stmt->bindValue(count($userArray) + 1, (int)trim($limit), PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result;

此代码似乎有错误。如果我发送一个包含值11和amp;的数组。 17,查询似乎只运行值17,而不是11和17。

如果我print_r($userArray),我会Array ( [0] => 11 [1] => 17 )

所以我知道php有正确的数组。但是,使用上面的代码运行此查询,并运行下面的查询会产生不同的答案:

SELECT * FROM tableA
WHERE tableA.id IN (11,17)
LIMIT 10

运行上面的代码时,它似乎实际运行此查询?

SELECT * FROM tableA
WHERE tableA.id IN (17)
LIMIT 10

我还在foreach循环中放置了语句,告诉我数组(11和17)的两个元素都绑定到$ stmt

1 个答案:

答案 0 :(得分:3)

问题是您使用的是bindParam()

  

将PHP变量绑定到用于准备语句的SQL语句中的相应命名或问号占位符。与PDOStatement::bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement::execute()时进行评估。

由于在$val循环的每次迭代中都更改了foreach,所以当最终执行查询时,每个占位符最终都是相同的。