मुझे एहसास है कि इस सवाल पर कोई नई गतिविधि होने के बाद से कुछ समय हो गया है। लेकिन, जैसा कि अन्य पोस्टरों ने टिप्पणी की है - get_result()
अब केवल MySQL के मूल चालक (mysqlnd) को स्थापित करके PHP में उपलब्ध है, और कुछ मामलों में, mysqlnd को स्थापित करना संभव या वांछनीय नहीं हो सकता है। इसलिए, मुझे लगा कि इस उत्तर को इस जानकारी के साथ पोस्ट करना उपयोगी होगा कि कैसे कार्यक्षमता मिलती है get_result()
- बिना उपयोग के get_result()
।
get_result()
/ / को अक्सर fetch_array()
परिणाम सेट के माध्यम से लूप के साथ जोड़ा जाता था और एक संख्यात्मक रूप से अनुक्रमित या साहचर्य सरणी में सेट किए गए परिणाम की प्रत्येक पंक्ति से मूल्यों को संग्रहीत करता है। उदाहरण के लिए, नीचे दिया गया कोड एक परिणाम सेट के माध्यम से प्राप्त करने के लिए get_result () with fetch_array () का उपयोग करता है, प्रत्येक पंक्ति से मानों को संख्यात्मक रूप से अनुक्रमित $ डेटा [] सरणी में संग्रहीत करता है:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
हालांकि, यदि get_result()
उपलब्ध नहीं है (क्योंकि mysqlnd स्थापित नहीं है), तो यह समस्या का कारण बनता है कि किसी सरणी में सेट किए गए परिणाम की प्रत्येक पंक्ति से मानों को कैसे संग्रहीत किया जाए, बिना उपयोग किए get_result()
। या, get_result()
इसके बिना चलाने के लिए उपयोग करने वाली विरासत कोड को माइग्रेट कैसे करें (जैसे कि bind_result()
इसके बजाय उपयोग करना) - जबकि बाकी कोड को कम से कम प्रभावित करना।
यह पता चलता है कि प्रत्येक पंक्ति से मानों को संख्यात्मक रूप से अनुक्रमित सरणी में संग्रहीत करना उपयोग करने के लिए इतना सीधा नहीं है bind_result()
। bind_result()
अदिश चर की एक सूची की उम्मीद करता है (एक सरणी नहीं)। तो, यह एक सरणी में सेट परिणाम की प्रत्येक पंक्ति से मूल्यों को संग्रहीत करने के लिए कुछ कर रहा है।
बेशक, कोड को आसानी से संशोधित किया जा सकता है:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
लेकिन, इसके लिए हमें कॉल में व्यक्तिगत रूप से कॉल करने के लिए $ डेटा [0], $ डेटा [1] आदि को स्पष्ट रूप से सूचीबद्ध करना होगा bind_result()
, जो आदर्श नहीं है। हम एक ऐसा समाधान चाहते हैं जिसके लिए हमें स्पष्ट रूप से $ डेटा [0], $ डेटा [1], ... $ डेटा [N-1] (जहाँ N, चयन कथन में फ़ील्ड की संख्या हो) को सूचीबद्ध करने की आवश्यकता नहीं है करने के लिए कॉल में bind_results()
। यदि हम एक ऐसी विरासत एप्लिकेशन का माइग्रेशन कर रहे हैं जिसमें बड़ी संख्या में क्वेरीज़ हैं, और प्रत्येक क्वेरी में select
क्लॉज़ में अलग-अलग फ़ील्ड हो सकती हैं , तो माइग्रेशन बहुत ही सघन होगा और यदि हम ऊपर दिए गए समाधान का उपयोग करते हैं तो त्रुटि का खतरा होगा ।
आदर्श रूप में, हम 'ड्रॉप-इन रिप्लेसमेंट' कोड का एक स्निपेट चाहते हैं - get_result()
अगली पंक्ति में फ़ंक्शन और जबकि () लूप वाली बस लाइन को बदलने के लिए । प्रतिस्थापन कोड में समान फ़ंक्शन होना चाहिए जो कोड को बदल रहा है, पहले किसी भी रेखा को प्रभावित किए बिना, या बाद में लाइनों में से किसी को प्रभावित किए बिना - जबकि () लूप के अंदर की पंक्तियों सहित। आदर्श रूप से हम चाहते हैं कि प्रतिस्थापन कोड जितना संभव हो उतना कॉम्पैक्ट हो, और हम select
क्वेरी के खंड में फ़ील्ड की संख्या के आधार पर प्रतिस्थापन कोड को अलग करना नहीं चाहते हैं ।
इंटरनेट पर खोज करने पर, मुझे कई समाधान मिले, जो
उदाहरण के लिए उपयोग bind_param()
करते हैं call_user_func_array()
(उदाहरण के लिए, डायनामिक रूप से mysqli_stmt मापदंडों को बाँधते हैं और फिर परिणाम (PHP) को बाँधते हैं , लेकिन ज्यादातर समाधान जो मुझे मिले हैं वे परिणाम को एक साहचर्य सरणी में संग्रहीत करने के लिए ले जाते हैं, नहीं) एक संख्यात्मक रूप से अनुक्रमित सरणी, और इनमें से कई समाधान उतने कॉम्पैक्ट नहीं थे जितना मैं चाहूंगा और / या 'ड्रॉप-इन प्रतिस्थापन' के रूप में अनुकूल नहीं था। हालाँकि, मुझे जो उदाहरण मिले, मैं इस समाधान को एक साथ मिलाने में सक्षम था, जो बिल को फिट करता है:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
बेशक, () लूप को अधिक कॉम्पैक्ट बनाने के लिए एक पंक्ति में ढहाया जा सकता है।
मुझे आशा है कि यह किसी को भी मदद करता है जो bind_result()
प्रत्येक पंक्ति से मानों को संख्यात्मक रूप से अनुक्रमित सरणी में संग्रहीत करने के लिए एक समाधान का उपयोग कर रहा है और / या विरासत कोड का उपयोग करने के लिए एक तरीका खोज रहा है get_result()
। टिप्पणियाँ स्वागत है।
$stmt = $conn->mysqli->stmt_init();
?