यह आपके लिए काम करना चाहिए:
तो जैसा कि पहले ही टिप्पणियों में कहा गया है, आपको प्रत्येक मान के लिए एक प्लेसहोल्डर की आवश्यकता है जिसे आप IN क्लॉज में बांधना चाहते हैं।
यहां मैं पहले सरणी $ids
. बनाता हूं जिसमें केवल प्लेन आईडी होते हैं, उदा.
[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
के मान होने पर आपकी क्वेरी नहीं चलेगी और $timeend
शून्य हैं।