Dit zou voor jou moeten werken:
Dus zoals al gezegd in de opmerkingen, heb je een tijdelijke aanduiding nodig voor elke waarde die je in de IN-clausule wilt binden.
Hier maak ik eerst de array $ids
die alleen de gewone id's bevat, bijvoorbeeld
[2, 3]
Toen maakte ik ook de array $preparedIds
die de tijdelijke aanduidingen als array bevat, die u later in de voorbereide instructie gebruikt. Deze array ziet er ongeveer zo uit:
[":id2", ":id3"]
En ik maak ook een array met de naam $preparedValues
die de $preparedIds
. bevat als sleutels en $ids
als waarden, die u later kunt gebruiken voor de execute()
telefoongesprek. De array ziet er ongeveer zo uit:
[":id2" => 2, ":id3" => 3]
Hierna ben je klaar om te gaan. In de voorbereide verklaring implode()
de $preparedIds
array, zodat de SQL-instructie er ongeveer zo uitziet:
... IN(:id2,:id3) ...
En dan kun je gewoon execute()
uw vraag. Daar heb ik gewoon array_merge()
uw $preparedValues
array met de andere placeholders 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;
}
?>
Ik denk ook dat je een if-statement rond je query wilt plaatsen, omdat je query niet wordt uitgevoerd als de waarden van $timestart
en $timeend
zijn NULL.