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.