Ini akan bekerja untuk Anda:
Jadi seperti yang sudah dikatakan di komentar, Anda memerlukan placeholder untuk setiap nilai yang ingin Anda ikat ke dalam klausa IN.
Disini saya buat dulu array $ids
yang hanya menyimpan id biasa, mis.
[2, 3]
Kemudian saya juga membuat array $preparedIds
yang menyimpan placeholder sebagai array, yang kemudian Anda gunakan dalam pernyataan yang disiapkan. Array ini terlihat seperti ini:
[":id2", ":id3"]
Dan saya juga membuat array bernama $preparedValues
yang menyimpan $preparedIds
sebagai kunci dan $ids
sebagai nilai, yang nantinya dapat Anda gunakan untuk execute()
panggilan. Array terlihat seperti ini:
[":id2" => 2, ":id3" => 3]
Setelah ini Anda baik untuk pergi. Dalam pernyataan yang disiapkan, saya hanya implode()
$preparedIds
array, sehingga pernyataan SQL terlihat seperti ini:
... IN(:id2,:id3) ...
Dan kemudian Anda cukup execute()
permintaan Anda. Di sana saya hanya array_merge()
$preparedValues
Anda array dengan array placeholder lainnya.
<?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;
}
?>
Saya juga pikir Anda ingin meletakkan pernyataan if di sekitar kueri Anda, karena kueri Anda tidak akan berjalan jika nilai $timestart
dan $timeend
adalah NULL.