Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

नामित प्लेसहोल्डर्स के साथ PDO तैयार स्टेटमेंट IN क्लॉज उम्मीद के मुताबिक काम नहीं करता है

यह आपके लिए काम करना चाहिए:

तो जैसा कि पहले ही टिप्पणियों में कहा गया है, आपको प्रत्येक मान के लिए एक प्लेसहोल्डर की आवश्यकता है जिसे आप 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 शून्य हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel 5.1 नियंत्रक और मॉडल का उपयोग कर साबुन wsdl सेवा का उपभोग करता है

  2. क्वेरी निष्पादित नहीं कर सकता, जबकि अन्य असंबद्ध क्वेरी लूप में सक्रिय त्रुटि हैं

  3. Mysql डेटाबेस दो डेटाबेस के बीच सिंक करता है

  4. mysql प्रत्येक पंक्ति में अन्य तालिका से पंक्तियों की संख्या दिखाएं

  5. MySQL टेबल स्टेटमेंट