Php 将位置占位符与WHERE IN一起使用只返回一个结果
我试图使用PDO将WHERE IN语句合并到一个已经在工作的查询中。我已经使用索引数组的计数遍历并动态创建了位置占位符,并循环遍历所述数组以绑定每个值。然而,当这一切都说了又做了,我只得到一个结果,特别是一个匹配我动态绑定的最后一个值的结果 此外,如果我简单地使用逗号作为分隔符来代替Php 将位置占位符与WHERE IN一起使用只返回一个结果,php,mysql,pdo,Php,Mysql,Pdo,我试图使用PDO将WHERE IN语句合并到一个已经在工作的查询中。我已经使用索引数组的计数遍历并动态创建了位置占位符,并循环遍历所述数组以绑定每个值。然而,当这一切都说了又做了,我只得到一个结果,特别是一个匹配我动态绑定的最后一个值的结果 此外,如果我简单地使用逗号作为分隔符来代替$placeholderSpots,将$arrayToCheck内爆,我将得到预期的全部24个结果 $arrayToCheck = json_decode($listFromDatabase); //This is
$placeholderSpots
,将$arrayToCheck
内爆,我将得到预期的全部24个结果
$arrayToCheck = json_decode($listFromDatabase); //This is a Python List converted to a string using Python's json.dumps, which was then passed into a database table.
$timePeriod = 0;
$rowLimit = 2500;
$placeholderSpots = implode(", ", array_fill(0, count($arrayToCheck), "?"));
$toPull = $GLOBALS['MainDatabase']->prepare("SELECT * FROM datatable WHERE timecolumn >= ? AND idcolumn IN ($placeholderSpots) ORDER BY timecolumn DESC LIMIT ?");
$toPull->bindParam(1, $timePeriod, PDO::PARAM_INT);
$tempCounter = 2;
foreach ($arrayToCheck as $eachID) {
$toPull->bindParam($tempCounter, $eachID, PDO::PARAM_INT);
$tempCounter++;
}
$toPull->bindParam($tempCounter, $rowLimit, PDO::PARAM_INT);
if ($toPull->execute()) {
while ($pulledData = $toPull->fetch(PDO::FETCH_ASSOC)) {
//Data Is Processed Here
}
}
您需要将
bindParam()
替换为bindValue()
该方法通过引用变量绑定。在数组上循环时,每次都为同一个变量指定一个新值,因此该变量不会更改,只有值会更改。最终结果是,您多次绑定了保存数组中最后一个值的同一变量。您需要将
bindParam()
替换为bindValue()
该方法通过引用变量绑定。在数组上循环时,每次都为同一个变量指定一个新值,因此该变量不会更改,只有值会更改。最终的结果是,您多次绑定了保存数组最后一个值的同一变量。我的意思是,如果您已经是bindParam,为什么不同时绑定
$placeholder
?您是否回显了$placeholder spots
以确保您从中得到了预期的结果?@Jimithus我可能有误解,但我认为您无法使用bind生成位置占位符。是的,我已经确认prepare语句有正确数量的占位符。不幸的是,我看不到final语句是什么样子,但是缺少一个错误可以确认传入的参数的数量是正确的,foreach循环中$eachID
的回声表明这是预期的。我的意思是,如果您已经是bindParam,为什么不同时绑定$placeholder
?您是否回显了$placeholder spots
以确保您从中得到了预期的结果?@Jimithus我可能有误解,但我认为您无法使用bind生成位置占位符。是的,我已经确认prepare语句有正确数量的占位符。不幸的是,我看不到final语句是什么样子,但缺少一个错误确认传入的参数数量正确,foreach循环中$eachID
的回声表明这是预期的。
foreach ($arrayToCheck as $eachID) {
$toPull->bindValue($tempCounter++, $eachID, PDO::PARAM_INT);
}