我在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
答案 0 :(得分:3)
问题是您使用的是bindParam()
:
将PHP变量绑定到用于准备语句的SQL语句中的相应命名或问号占位符。与
PDOStatement::bindValue()
不同,变量被绑定为引用,并且仅在调用PDOStatement::execute()
时进行评估。
由于在$val
循环的每次迭代中都更改了foreach
,所以当最终执行查询时,每个占位符最终都是相同的。