समस्या यहाँ है:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
मुझे लगता है कि $regGUID उद्धृत स्ट्रिंग्स की अल्पविराम से अलग की गई सूची है।
प्रत्येक क्वेरी पैरामीटर केवल एक अदिश मान को स्वीकार करता है। नहीं सूचियां मूल्यों का।
तो आपके पास दो विकल्प हैं:
-
$regGUID स्ट्रिंग को इंटरपोलेट करना जारी रखें, भले ही आप अन्य स्केलर मानों के लिए पैरामीटर का उपयोग करें। लेकिन आप अभी भी SQL इंजेक्शन से बचने के लिए सावधान रहना चाहते हैं, इसलिए आपको $regGUID स्ट्रिंग को सही ढंग से बनाना होगा। आप पूरी स्ट्रिंग पर केवल PDO::quote() को कॉल नहीं कर सकते हैं, जो इसे UUIDs और अल्पविराम वाली एकल उद्धृत स्ट्रिंग बना देगा। आपको यह सुनिश्चित करना होगा कि प्रत्येक यूयूआईडी स्ट्रिंग बच निकली है और अलग-अलग उद्धृत की गई है, फिर सूची को एक साथ इंपोड करें और इसे आईएन क्लॉज में इंटरपोलेट करें।
$regGUIDs = explode(',', $regGUID); $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs); $regGUID = implode(',', $regGUIDs); $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
-
explode()
एक सरणी में $regGUID, और सरणी में प्रत्येक तत्व के लिए एक क्वेरी पैरामीटर जोड़ें। क्वेरी पैरामीटर प्लेसहोल्डर्स की गतिशील सूची को इंटरपोलेट करें।$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
आप सरणी के लिए लूप में बाइंडवैल्यू() कर सकते हैं, लेकिन ध्यान रखें कि अन्य पैरामीटर भी स्थिति से बंधे होने चाहिए, नाम से नहीं। जब आप एक ही क्वेरी में पैरामीटर की दो अलग-अलग शैलियों को मिलाने का प्रयास करते हैं, तो PDO में बग होते हैं जो इसे खुश नहीं करते हैं।
बाइंडवैल्यू() का उपयोग करने के बजाय मैं पैरामीटर मानों की एक सरणी को PDOStatement::execute() में पास करता हूं, जो बहुत आसान है।
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);