जैसा कि अक्सर होता है, यह सवाल नरक के रूप में भ्रमित है। लोग दो अलग-अलग कार्यों को ध्यान में रखते हुए यहां आ रहे हैं:
- उन्हें यह जानना होगा कि तालिका में कितनी पंक्तियाँ हैं
- उन्हें यह जानना होगा कि क्या कोई क्वेरी किसी भी पंक्तियों को वापस करती है
यह दो बिल्कुल अलग कार्य हैं जिनमें कुछ भी सामान्य नहीं है और एक ही फ़ंक्शन द्वारा हल नहीं किया जा सकता है। विडंबना यह है कि उनमें से किसी के लिए भी वास्तविक PDOStatement::rowCount()
कार्य का उपयोग नहीं किया गया है।
आइए देखें क्यों
तालिका में पंक्तियों की गिनती
पीडीओ का उपयोग करने से पहले मैं बस इस्तेमाल करता हूं mysql_num_rows()
।
मतलब आपने पहले ही गलत कर दिया था। सर्वर संसाधनों के उपभोग के मामले में तालिका में पंक्तियों की संख्या का उपयोग करना mysql_num_rows()
या rowCount()
गणना करना एक वास्तविक आपदा है। एक डेटाबेस को डिस्क से सभी पंक्तियों को पढ़ना पड़ता है, डेटाबेस सर्वर पर मेमोरी का उपभोग करता है, फिर डेटा के इस ढेर को PHP में भेजना, PHP प्रक्रिया की मेमोरी का उपभोग करना, अपने सर्वर को पूर्ण रूप से बिना किसी कारण के बोझ करना।
इसके अलावा, केवल उन्हें गिनने के लिए पंक्तियों का चयन करने से कोई मतलब नहीं है। count(*)
इसके बजाय एक क्वेरी चलानी होगी। डेटाबेस वास्तविक पंक्तियों को पढ़े बिना , सूचकांक से बाहर रिकॉर्ड की गणना करेगा और फिर केवल एक पंक्ति लौटाएगा।
इस उद्देश्य के लिए स्वीकृत उत्तर में सुझाया गया कोड उचित है।
गिनती की गई पंक्तियाँ वापस आ गईं।
दूसरा उपयोग मामला उतना व्यर्थ नहीं है जितना कि व्यर्थ है: यदि आपको यह जानने की आवश्यकता है कि क्या आपकी क्वेरी ने कोई डेटा वापस किया है, तो आपके पास हमेशा डेटा ही होता है!
कहो, यदि आप केवल एक पंक्ति का चयन कर रहे हैं। सब ठीक है, आप एक ध्वज के रूप में प्राप्त पंक्ति का उपयोग कर सकते हैं:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
यदि आपको कई पंक्तियों को प्राप्त करने की आवश्यकता है, तो आप उपयोग कर सकते हैं fetchAll()
।
fetchAll()
जैसा कि मैं कभी-कभी बड़े डेटासेट के साथ काम कर सकता हूं, ऐसा कुछ नहीं है
हां, पहले उपयोग के मामले में यह दोगुना बुरा होगा। लेकिन जैसा कि हमने पहले ही सीखा था, केवल पंक्तियों को केवल उन्हें गिनने के लिए नहीं चुनें, न rowCount()
ही साथ में fetchAll()
।
लेकिन अगर आप वास्तव में चयनित पंक्तियों का उपयोग करने जा रहे हैं, तो उपयोग करने में कुछ भी गलत नहीं है fetchAll()
। याद रखें कि वेब एप्लिकेशन में आपको कभी भी बड़ी मात्रा में पंक्तियों का चयन नहीं करना चाहिए। केवल पंक्तियों है कि वास्तव में एक वेब पेज पर उपयोग किया जाएगा चयनित होना चाहिए, इसलिए आप उपयोग करने के लिए मिल गया है LIMIT
, WHERE
या अपने एसक्यूएल में एक समान खंड। और इस तरह की डेटा की मामूली मात्रा के लिए इसका उपयोग करना सही है fetchAll()
। और फिर, बस इस फ़ंक्शन के परिणाम को स्थिति में उपयोग करें:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
और निश्चित रूप से यह बताने के लिए एक अतिरिक्त क्वेरी चलाने के लिए पूर्ण पागलपन होगा कि क्या आपकी अन्य क्वेरी ने किसी भी पंक्तियों को वापस कर दिया है, जैसा कि दो शीर्ष उत्तरों में सुझाया गया है।
एक बड़े परिणाम में पंक्तियों की संख्या की गिनती
ऐसे दुर्लभ मामले में जब आपको वास्तविक बड़ी मात्रा में पंक्तियों (उदाहरण के लिए एक कंसोल एप्लिकेशन में) का चयन करने की आवश्यकता होती है, तो आपको उपयोग की गई स्मृति को कम करने के लिए, एक अप्रतिबंधित क्वेरी का उपयोग करना होगा। लेकिन यह वास्तविक मामला है जब rowCount()
उपलब्ध नहीं होगा , इस प्रकार इस समारोह के लिए भी कोई फायदा नहीं है।
इसलिए, यह एकमात्र उपयोग का मामला है जब आपको संभवतः एक अतिरिक्त क्वेरी चलाने की आवश्यकता हो सकती है, यदि आपको चयनित पंक्तियों की संख्या के लिए एक करीबी अनुमान जानना आवश्यक है।