Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przygotowane instrukcje PDO Klauzula IN z nazwanymi symbolami zastępczymi nie działa zgodnie z oczekiwaniami

To powinno działać dla Ciebie:

Jak już wspomniano w komentarzach, potrzebujesz symbolu zastępczego dla każdej wartości, którą chcesz powiązać z klauzulą ​​IN.

Tutaj najpierw tworzę tablicę $ids który zawiera tylko zwykłe identyfikatory, np.

[2, 3]

Następnie utworzyłem również tablicę $preparedIds który przechowuje symbole zastępcze jako tablicę, której później użyjesz w przygotowanej instrukcji. Ta tablica wygląda mniej więcej tak:

[":id2", ":id3"]

Tworzę również tablicę o nazwie $preparedValues który przechowuje $preparedIds jako klucze i $ids jako wartości, których później możesz użyć do execute() połączenie. Tablica wygląda mniej więcej tak:

[":id2" => 2, ":id3" => 3]

Po tym możesz już iść. W przygotowanym oświadczeniu po prostu implode() $preparedIds tablicę, tak aby instrukcja SQL wyglądała mniej więcej tak:

... IN(:id2,:id3) ...

A potem możesz po prostu execute() Twoje zapytanie. Tam po prostu array_merge() Twoje $preparedValues tablica z innymi tablicami symboli zastępczych.

<?php

    $ids = array_map(function($item){
        return $item->id;
    }, $entitlementsVOs);

    $preparedIds = array_map(function($v){
        return ":id$v";
    }, $ids);

    $preparedValues = array_combine($preparedIds, $ids);


    $timestart = (!empty($_GET['start']) ? $_GET['start'] : NULL );
    $timeend = (!empty($_GET['end']) ? $_GET['end'] : NULL );


    $statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(" . implode(",", $preparedIds) . ") AND timestart >= :timestart AND timestart + timeduration <= :timeend");
    $statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));

    if($statement->execute(array_merge($preparedValues, ["timestart" => $timestart, "timeend" => $timeend]))) {
        return $statement->fetchAll();
    } else {
        return null;
    }

?>

Myślę też, że chcesz umieścić instrukcję if wokół zapytania, ponieważ zapytanie nie zostanie uruchomione, jeśli wartości $timestart i $timeend są NULL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Suma bieżąca w każdej grupie przy użyciu MySQL

  2. mysql konwertuje z UTC na IST

  3. jak wymusić warunkowe ograniczenie unikalności

  4. Korzystanie z Magento API v/s zwykłego MySQL

  5. Jak zmienić podciągi?