1

我在 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 和 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

4

1 回答 1

3

问题是您正在使用bindParam()

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

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

于 2012-10-12T11:16:04.173 回答