これはあなたのために働くはずです:
したがって、コメントですでに述べたように、IN句にバインドする値ごとにプレースホルダーが必要です。
ここでは、最初に配列$ids
を作成します プレーンIDのみを保持します。例:
[2, 3]
次に、配列$preparedIds
も作成しました これはプレースホルダーを配列として保持し、後でプリペアドステートメントで使用します。この配列は次のようになります:
[":id2", ":id3"]
また、$preparedValues
という配列も作成します。 $preparedIds
を保持します キーおよび$ids
として 値として、後でexecute()
に使用できます 電話。配列は次のようになります:
[":id2" => 2, ":id3" => 3]
この後、あなたは行ってもいいです。プリペアドステートメントでは、implode()
だけです。 $preparedIds
配列。SQLステートメントは次のようになります。
... IN(:id2,:id3) ...
そして、あなたは単にexecute()
することができます あなたのクエリ。そこで私はarray_merge()
$preparedValues
他のプレースホルダー配列との配列。
<?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;
}
?>
また、$timestart
の値の場合、クエリは実行されないため、クエリの前後にifステートメントを配置することをお勧めします。 および$timeend
NULLです。