Detta borde fungera för dig:
Så som redan sagts i kommentarerna behöver du en platshållare för varje värde som du vill binda till IN-satsen.
Här skapar jag först arrayen $ids
som bara innehåller de vanliga id:en, t.ex.
[2, 3]
Sedan skapade jag också arrayen $preparedIds
som håller platshållarna som array, som du sedan använder i den förberedda satsen. Den här arrayen ser ut ungefär så här:
[":id2", ":id3"]
Och jag skapar också en array som heter $preparedValues
som innehåller $preparedIds
som nycklar och $ids
som värden, som du sedan kan använda för execute()
ringa upp. Arrayen ser ut ungefär så här:
[":id2" => 2, ":id3" => 3]
Efter detta är du bra att gå. I det förberedda uttalandet implode()
$preparedIds
array, så att SQL-satsen ser ut ungefär så här:
... IN(:id2,:id3) ...
Och sedan kan du helt enkelt execute()
din fråga. Där har jag bara array_merge()
dina $preparedValues
array med den andra platshållarmatrisen.
<?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;
}
?>
Jag tror också att du vill lägga en if-sats runt din fråga, eftersom din fråga inte kommer att köras om värdena för $timestart
och $timeend
är NULL.