MySQL क्लाइंट आपको एक नई क्वेरी निष्पादित करने की अनुमति नहीं देता है जहाँ अभी भी एक इन-प्रोग्रेस क्वेरी से प्राप्त की जाने वाली पंक्तियाँ हैं। देखें कमांड आउट ऑफ सिंक सामान्य त्रुटियों पर MySQL दस्तावेज़ में।
आप mysqli_store_result()
का इस्तेमाल कर सकते हैं
बाहरी क्वेरी से सभी पंक्तियों को पूर्व-प्राप्त करने के लिए। यह उन्हें MySQL क्लाइंट में बफर कर देगा, इसलिए सर्वर के दृष्टिकोण से आपके ऐप ने पूरा परिणाम सेट प्राप्त कर लिया है। फिर आप अब-बफ़र किए गए बाहरी परिणाम सेट से पंक्तियों को लाने के एक लूप में भी अधिक क्वेरी निष्पादित कर सकते हैं।
या आप mysqli_result::fetch_all()
कोड>
जो एक PHP सरणी के रूप में सेट पूर्ण परिणाम देता है, और फिर आप उस सरणी पर लूप कर सकते हैं।
संग्रहीत कार्यविधियों को कॉल करना एक विशेष मामला है, क्योंकि एक संग्रहीत कार्यविधि में कई परिणाम सेट वापस करने की क्षमता होती है, जिनमें से प्रत्येक में पंक्तियों का अपना सेट हो सकता है। इसीलिए @a1ex07 के उत्तर में mysqli_multi_query()
का उपयोग करने का उल्लेख है और mysqli_next_result()
. तक लूपिंग करें कोई और परिणाम सेट नहीं है। यह MySQL प्रोटोकॉल को संतुष्ट करने के लिए आवश्यक है, भले ही आपके मामले में आपकी संग्रहीत प्रक्रिया में एक ही परिणाम सेट हो।
पीएस:वैसे, मैं देख रहा हूं कि आप नेस्टेड प्रश्न कर रहे हैं क्योंकि आपके पास पदानुक्रम का प्रतिनिधित्व करने वाला डेटा है। हो सकता है कि आप डेटा को अलग तरीके से संग्रहीत करने पर विचार करना चाहें, ताकि आप इसे अधिक आसानी से क्वेरी कर सकें। मैंने इसके बारे में मॉडल्स फॉर हायरार्किकल डेटा विद एसक्यूएल और पीएचपी शीर्षक से एक प्रेजेंटेशन किया था। ए> . मैं इस विषय को अपनी पुस्तक SQL Antipatterns:अवॉइडिंग द डैमेज ऑफ डाटाबेस के एक अध्याय में भी शामिल करता हूं। प्रोग्रामिंग ।
यहां mysqli_next_result()
को लागू करने का तरीका बताया गया है कोडइग्निटर 3.0.3 में:
system/database/drivers/mysqli/mysqli_driver.php
की लाइन 262 पर बदलें
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
इसके लिए
protected function _execute($sql)
{
$results = $this->conn_id->query($this->_prep_query($sql));
@mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
return $results;
}
यह 2.x के बाद से एक मुद्दा रहा है। मैंने अभी-अभी 3.x में अपडेट किया है और इस हैक को नए संस्करण में कॉपी करना था।