Исправление внутри SQL-запроса в PHP (WHERE...IN)
у меня есть array
с именем $cuentas
из N элементов, такие элементы я хочу передать один за другим в запрос SQL
, то есть де возвращает мне данные для каждого элемента внутри array
, а затем сохранить его в другом array
.
я пытался сделать bindParam
внутри foreach
, а затем execute
, но это занимает много времени, так как он выполняет N раз:
foreach($cuentas as $row){
$stid->bindParam(':cuenta', $row, PDO::PARAM_STR);
$stid->execute();
$resultado = $stid->fetchAll(PDO::FETCH_COLUMN);
}
я избегаю использования execute
внутри foreach
из-за медлительности ответа.
Лэй я мог бы использовать WHERE ... IN
в моем запросе SQL
, но я не могу сделать это правильно, и я не знаю, потому что.
$inQuery = str_repeat('?,', count($cuentas) - 1) . '?';
var_dump($inQuery);
$stid = $conn->prepare("SELECT SALDO FROM ( SELECT G305.G305S01 AS SALDO
FROM BI_SRC.GSCF300 G300, BI_SRC.GSCF305 G305
WHERE G300.G300CTA IN (:cuenta) AND G300.G300UUID = G305.G301UUID
AND TRUNC(G305.G305FDIA) >= TO_DATE(:fecha,'YYYY-MM-DD')-1
GROUP BY G300.G300CTA, G305.G305FDIA, G305.G305S01
ORDER BY G305.G305FDIA DESC)
WHERE ROWNUM <= 1");
$stid->bindParam(':fecha', $fechaConsulta, PDO::PARAM_STR, 10);
$stid->bindValue(':cuenta', $inQuery, PDO::PARAM_STR);
$stid->execute();
$resultado = $stid->fetchAll(PDO::FETCH_COLUMN);
// $stid->closeCursor();
echo "<pre>";
print_r($resultado);
echo "</pre>";
Заранее спасибо.
2
Author: Víctor Álvarez, 2019-05-28
1 answers
Предполагая, что ваш массив имеет форму (1,2,3)
$cuenta = array(1,2,3,4,5); //tu array de valores
$inQuery = implode(',', array_fill(0, count($cuenta), '?')); //separamos los valores por , y llenamos el array con ? que son la cantidad de parametros en la consulta
//eso impirmiria algo asi: ?,?,?,?,?
stid = $conn->prepare("SELECT SALDO FROM ( SELECT G305.G305S01 AS SALDO
FROM BI_SRC.GSCF300 G300, BI_SRC.GSCF305 G305
WHERE G300.G300CTA IN ($inQuery) AND G300.G300UUID = G305.G301UUID
AND TRUNC(G305.G305FDIA) >= TO_DATE(:fecha,'YYYY-MM-DD')-1
GROUP BY G300.G300CTA, G305.G305FDIA, G305.G305S01
ORDER BY G305.G305FDIA DESC)
WHERE ROWNUM <= 1");
У вас уже есть подготовленный запрос теперь мы передаем значения:
foreach ($cuenta as $key => $value){
$stid->bindParam($key+1, $value);
}//estar recorriendo tu array y pasandole los valores a tu bindParam
$stid->execute();
$resultado = $stid->fetchAll(PDO::FETCH_COLUMN);
1
Author: Igmer Rodriguez, 2019-05-28 16:53:16