Điều này sẽ phù hợp với bạn:
Vì vậy, như đã nói trong phần nhận xét, bạn cần một trình giữ chỗ cho mỗi giá trị mà bạn muốn liên kết với mệnh đề IN.
Ở đây, đầu tiên tôi tạo mảng $ids
chỉ chứa các id đơn giản, ví dụ:
[2, 3]
Sau đó, tôi cũng tạo mảng $preparedIds
giữ chỗ giữ chỗ dưới dạng mảng, sau này bạn sử dụng trong câu lệnh đã chuẩn bị. Mảng này trông giống như sau:
[":id2", ":id3"]
Và tôi cũng tạo một mảng có tên là $preparedValues
chứa $preparedIds
dưới dạng khóa và $ids
dưới dạng các giá trị mà sau này bạn có thể sử dụng cho execute()
cuộc gọi. Mảng trông giống như sau:
[":id2" => 2, ":id3" => 3]
Sau đó, bạn có thể đi. Trong câu lệnh đã chuẩn bị, tôi chỉ implode()
$preparedIds
mảng, để câu lệnh SQL trông giống như sau:
... IN(:id2,:id3) ...
Và sau đó bạn có thể chỉ cần execute()
truy vấn của bạn. Ở đó tôi vừa array_merge()
$preparedValues
của bạn mảng với mảng trình giữ chỗ khác.
<?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;
}
?>
Ngoài ra, tôi nghĩ bạn muốn đặt câu lệnh if xung quanh truy vấn của mình, vì truy vấn của bạn sẽ không chạy nếu các giá trị của $timestart
và $timeend
là KHÔNG.