Использование позиционных заполнителей с WHERE IN возвращает только один результат

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

Я пытаюсь включить оператор WHERE IN в уже работающий запрос, используя PDO. Я просматривал и динамически создавал позиционные заполнители, используя количество индексированного массива, и перебирал указанный массив для привязки каждого значения. Однако, когда все это сказано и сделано, я получаю только один результат, в частности результат, соответствующий последнему значению, которое я динамически привязал.

Чтобы добавить к этому, если я просто взорвусь $arrayToCheck с запятой в качестве разделителя вместо $placeholderSpots , я получу полные 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
    }
}
 

Комментарии:

1. Я имею в виду, если вы уже являетесь bindParam, почему вы $placeHolderSpots также не связываете? Вы повторили echo’ed $placeHolderSpots , чтобы убедиться, что вы получаете то, что ожидали от этого?

2. @Jimithus Возможно, я неправильно понимаю, но я не думаю, что вы можете генерировать позиционные заполнители с помощью bind. И да, я подтвердил, что оператор prepare содержит правильное количество заполнителей. К сожалению, я не вижу, как выглядит последнее утверждение, но отсутствие ошибки подтверждает, что передается правильное количество параметров, и эхо $eachID в цикле foreach показывает, что все так, как ожидалось.

Ответ №1:

Вам нужно заменить bindParam() на bindValue() .

 foreach ($arrayToCheck as $eachID) {
    $toPull->bindValue($tempCounter  , $eachID, PDO::PARAM_INT);
}
 

bindParam() Метод привязывается по ссылке на переменную. Вы присваиваете новое значение каждый раз одной и той же переменной при циклическом перемещении по массиву, поэтому переменная не меняется, меняется только значение. Конечным результатом является то, что вы несколько раз связали одну и ту же переменную, которая содержит последнее значение из массива.