Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将位置占位符与WHERE IN一起使用只返回一个结果_Php_Mysql_Pdo - Fatal编程技术网

Php 将位置占位符与WHERE IN一起使用只返回一个结果

Php 将位置占位符与WHERE IN一起使用只返回一个结果,php,mysql,pdo,Php,Mysql,Pdo,我试图使用PDO将WHERE IN语句合并到一个已经在工作的查询中。我已经使用索引数组的计数遍历并动态创建了位置占位符,并循环遍历所述数组以绑定每个值。然而,当这一切都说了又做了,我只得到一个结果,特别是一个匹配我动态绑定的最后一个值的结果 此外,如果我简单地使用逗号作为分隔符来代替$placeholderSpots,将$arrayToCheck内爆,我将得到预期的全部24个结果 $arrayToCheck = json_decode($listFromDatabase); //This is

我试图使用PDO将WHERE IN语句合并到一个已经在工作的查询中。我已经使用索引数组的计数遍历并动态创建了位置占位符,并循环遍历所述数组以绑定每个值。然而,当这一切都说了又做了,我只得到一个结果,特别是一个匹配我动态绑定的最后一个值的结果

此外,如果我简单地使用逗号作为分隔符来代替
$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);
}