Dette burde fungere for dig:
Så som allerede nævnt i kommentarerne skal du bruge en pladsholder for hver værdi, som du vil binde ind i IN-sætningen.
Her opretter jeg først arrayet $ids
som kun holder de almindelige id'er, f.eks.
[2, 3]
Så oprettede jeg også arrayet $preparedIds
som holder pladsholderne som array, som du så senere bruger i den forberedte sætning. Dette array ser nogenlunde sådan ud:
[":id2", ":id3"]
Og jeg opretter også et array kaldet $preparedValues
som indeholder $preparedIds
som nøgler og $ids
som værdier, som du så senere kan bruge til execute()
opkald. Arrayet ser nogenlunde sådan ud:
[":id2" => 2, ":id3" => 3]
Efter dette er du god til at gå. I den forberedte sætning implode()
$preparedIds
array, så SQL-sætningen ser sådan ud:
... IN(:id2,:id3) ...
Og så kan du simpelthen execute()
din forespørgsel. Der er jeg bare array_merge()
dine $preparedValues
array med de andre pladsholdere array.
<?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;
}
?>
Jeg tror også, du vil sætte en if-sætning omkring din forespørgsel, da din forespørgsel ikke vil køre, hvis værdierne for $timestart
og $timeend
er NULL.