#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()
Метод привязывается по ссылке на переменную. Вы присваиваете новое значение каждый раз одной и той же переменной при циклическом перемещении по массиву, поэтому переменная не меняется, меняется только значение. Конечным результатом является то, что вы несколько раз связали одну и ту же переменную, которая содержит последнее значение из массива.