Исправление внутри 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>";

Заранее спасибо.

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