2012-11-02 24 views
11

वाली पंक्तियों की संख्या प्राप्त मैं एक साधारण पीडीओ तैयार प्रश्न हैं:पीडीओ

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->fetch(PDO::FETCH_NUM); 
echo $rows[0]; 

गूंज रिकॉर्ड, नहीं क्वेरी द्वारा रिटर्न अभिलेखों की संख्या की ID मान लौटने किया जा रहा है?

इसके लिए कोई विचार या स्पष्टीकरण?

उत्तर

7

PDO::FETCH_NUM: एक सरणी स्तंभ संख्या द्वारा अनुक्रमित रिटर्न के रूप में अपने परिणाम सेट में लौट आए, स्तंभ 0

आप फ़ेच नहीं कर रहे पर शुरू पंक्ति-गिनती बिल्कुल।

SELECT COUNT(*) FROM coursescompleted where person=:p 

इस क्वेरी में $rows[0];

संपादित कुल पंक्तियों को वापस होगा: कृपया @ रे के जवाब देखें। count(id) का उपयोग करके InnoDB के लिए count(*) से बेहतर है।


आप अपनी पिछली क्वेरी से निम्नलिखित तरीके से पंक्ति-गणना प्राप्त कर सकते हैं।

$row_count = $result->rowCount(); 

लेकिन चेतावनी दी:

तो पिछले SQL विवरण जुड़े PDOStatement द्वारा निष्पादित था एक SELECT कथन, कुछ डेटाबेस पंक्तियों कि बयान द्वारा वापस की संख्या वापस आ सकते हैं। हालांकि, इस व्यवहार को सभी डेटाबेस के लिए की गारंटी नहीं है और पोर्टेबल एप्लिकेशन के लिए भरोसा नहीं किया जाना चाहिए।

+0

धन्यवाद, पूरी तरह से काम करता है। मेरी समस्या मेरे शरीर में है, मैं 'जबकि ($ पंक्ति = $ परिणाम-> fetch (पीडीओ :: FETCH_ASSOC) का उपयोग करके पुनः प्राप्त किए गए परिणाम प्राप्त करता हूं)' मैं एक एकल mysql क्वेरी के साथ कैसे पूरा कर सकता हूं या क्या मुझे प्रत्येक फ़ंक्शन के लिए दो की आवश्यकता है? एक बार फिर धन्यवाद। – Smudger

+0

मुझे यकीन नहीं है। क्या आप अपनी पुरानी क्वेरी के साथ '$ row_count = $ result-> rowCount();' कोशिश कर सकते हैं? कुछ रिपोर्ट है कि पीडीओ_MySQL ड्राइवर अन्यथा कहने वाले दस्तावेज़ीकरण के बावजूद काम करने की अनुमति देता है। –

+0

यदि यह काम नहीं करता है, तो मुझे लगता है कि आप अभी भी पंक्तियों के माध्यम से पंक्तियों के माध्यम से पंक्तियों को गिन सकते हैं, 'fetch' में। यकीन नहीं है कि यह कितना बुरा है। –

2

echo count($rows);$rows एक सरणी है।

संपादित करें:

उपयोग करने के लिए परिणाम

$rows = $result->fetchAll(/* nothing here */); 
if(count($rows) > 0) { 
    // Show results, perhaps using a foreach($rows as $row) 
} else { 
echo "Sorry, no results found"; 
} 
+1

यह उसे दिलवाया स्तंभों की संख्या है, यानी 2, हर बार देना होगा पीएचपी मैनुअल में है। पीडीओएसटेमेंट :: fetch() एक पंक्ति देता है। PDOStatement :: fetchAll() पूरे एक सरणी – Stephen

+1

क्या सवाल पूछ रहा है है कि के रूप में स्थापित परिणाम देता है "गूंज रिकॉर्ड के ID मान लौटने किया जा रहा है,' क्वेरी द्वारा returned' रिकॉर्ड की नहीं संख्या? " –

+0

हालांकि मुझे लगता है कि ऐसा लगता है कि उसे वास्तव में क्वेरी सामग्री की आवश्यकता नहीं है, इसलिए एक एसक्यूएल 'गिनती()' बेहतर है। –

16

आप एक प्रश्न है कि डेटाबेस से पंक्तियों रिटर्न निष्पादित कर दिया है, एक चर में परिणाम से पहली पंक्ति दिलवाया और फिर उस पंक्ति के पहले स्तंभ echo'd।

SELECT COUNT(id) FROM coursescompleted WHERE person=:p; 

गिनती (*) से बचें:

आप की गणना करना चाहते हैं, तो एक एसक्यूएल गिनती()

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rowCount = $result->fetchColumn(0); 
echo $rowCount; 
3

id मान लिया जाये कि प्राथमिक कुंजी उपयोग है। यदि आपका स्टोरेज इंजन InnoDB है (संभवतः MyIsam को छोड़कर अन्य) तो आप एक प्रदर्शन हिट लेंगे।

+0

क्या आप निश्चित हैं कि कोई प्रदर्शन हिट है? [यह उत्तर] (http://stackoverflow.com/a/1697144/759019) अन्यथा कहता है, mysql के लिए। –

+1

@ कथुलू मैं निश्चित हूं। MyISAM गिनती (*) और गिनती (आईडी) कर सकता है यदि आईडी एक ही समय में पीके है (मेमोरी टेबल भी गिनती (*) के साथ अच्छे हैं), लेकिन यदि आपकी तालिका इनोडब स्टोरेज इंजन है तो आप जा रहे हैं अपने पैर को शूट करने के लिए: http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – Ray

-2

आप इस

<?php 
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->rowCount(); 
echo $rows; 
?> 

यह कभी कभी SELECT प्रश्नों पर काम नहीं करता है का उपयोग कर सकते हैं। लेकिन व्यक्तिगत अनुभव के आधार पर, और चूंकि आपने इसे अन्य डेटाबेस सिस्टम में पोर्ट करने का उल्लेख नहीं किया है, इसलिए इसे MySQL पर काम करना चाहिए।

अधिक जानकारी here