2012-12-31 33 views
5

बिना MYSQL पीडीओ में 2 बार लाने के लिए मैं इस नमूना क्वेरी है:कैसे FETCHALL

$STH = $DBH->query("SELECT id FROM table"); 

मैं पहली पंक्ति और फिर पाश हो और सभी पंक्तियों को प्रदर्शित करना चाहते।

$STH->setFetchMode(PDO::FETCH_ASSOC); 
$first_row = $STH->fetch(); 
$first_row = $first_row['id']; 

जबकि पाश सभी पंक्तियों को फिर से प्रदर्शित करने के लिए मैं का उपयोग करें:: तो मैं पहली पंक्ति पाने के लिए निम्नलिखित का उपयोग

while ($list = $STH->fetch()) {  
$id = $list['id']; 
echo $id; 
} 

अब जबकि छोड़ देता है तो पहली पंक्ति और मैं इसे प्रदर्शित करना चाहते हैं। पॉइंटर को फिर से पहली पंक्ति में रीसेट करने के लिए mysql_data_seek के बराबर है? मुझे पता है fetchall का उपयोग किया जा सकता है लेकिन यह स्मृति और अपमानजनक पर बुरा है। मैं क्वेरी भी चला सकता हूं और 1 तक सीमित कर सकता हूं लेकिन इसकी अनुशंसा नहीं की जाती क्योंकि मेरे पास एक क्वेरी है जो एकाधिक तालिकाओं में शामिल होती है और बहुत धीमी होगी। क्या कोई अन्य समाधान है?

धन्यवाद

उत्तर

5

मैं ले जैसे आप परिणाम को चुनने के लिए कर्सर उन्मुखीकरण contants उपयोग कर सकते हैं कि वापस लग रहा है ... नमूना कोड आ रहा है ... मैंने इस कोशिश की है ताकि आपको थोड़ा सा खेलना पड़े। यह इस धारणा पर भी आधारित है कि PDO::FETCH_ORI_FIRST डेटा_सेक की तरह कार्य करता है और कर्सर को पहले स्थान पर छोड़ देता है क्योंकि इसे पहले जो भी पहले किया गया था उसे वापस करने के विपरीत।

$stmt = $pdo->prepare('SELECT id FROM table', array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 
$stmt->execute(); 

$first = $pdo->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_FIRST); 
$first_row = $first['id']; 

// other stuff 

// first iteration we rewind to the first record; 
$cursor = PDO::FETCH_ORI_FIRST; 

while (false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC, $cursor))) { 
    $id = $row['id']; 
    // successive iterations we hit the "next" record 
    $cursor = PDO::FETCH_ORI_NEXT; 
    echo $id; 
} 

मुझे लगता है कि आप एक बयान रिवाइंड कर सकते हैं न ... इन ब्लॉकों मान लिया जाये कि मध्यस्थ तर्क आईडी का एक समूह द्वारा seprated नहीं कर रहे हैं बस पाश में करते हैं।

$STH->setFetchMode(PDO::FETCH_COLUMN); // no need to pull an array 
$count = 0; 
while ($id = $STH->fetch()) {  
    if($count === 0) { 
    $first_row = $id; 
    } 
    echo $id; 
    $count++; 
} 
+0

मुझे इसे सभी पंक्तियों का उपयोग करने के लिए एक सरणी में होना चाहिए, मुझे इसे किसी अन्य उद्देश्य के लिए उपयोग करने के लिए पहले पंक्ति को प्रदर्शित करने की आवश्यकता है ... धन्यवाद :) –

+0

ठीक है आपने केवल अपने उदाहरण में 'id' चुना है। .. – prodigitalson

+0

यह समस्या को समझाने के लिए सिर्फ एक सरलीकृत क्वेरी है .. क्वेरी –

1

तुम सिर्फ बजाय एक do...while पाश का उपयोग कर सकते हैं?

$STH->setFetchMode(PDO::FETCH_ASSOC); 
$list = $STH->fetch(); 
$first_id = $list['id']; 

do { 
    $id = $list['id']; 
    echo $id; 
} while ($list = $STH->fetch()); 
+0

किसी कारण से इस आदेश पर ध्यान नहीं देता क्वेरी में से ... धन्यवाद :) –

+0

@Michael - वास्तव में? मैं नहीं देख रहा हूं कि क्वेरी में 'ऑर्डर बाय' पर इसका कोई असर कैसे हो सकता है ... –

+0

यह भी नहीं पता कि ऐसा क्यों होता है .. मैं desc द्वारा ऑर्डर कर रहा हूं लेकिन अब यह –

1

आप सभी परिणाम प्राप्त कर सकते हैं, और उसके बाद बस इसे एक सरणी के रूप में कार्य कर सकते हैं। तो, उदाहरण के लिए, आप पहली बार परिणाम सामने बंद पाश किसी भी अतिरिक्त पंक्तियों पर बदलाव कर सकता है, और उसके बाद:

<?php 

$sql = "YOUR QUERY"; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

// get first row 
$firstRow = array_shift($rows); 

// loop over remaining rows 
foreach ($rows as $row) { 
    // do something 
} 
+0

आरोही के रूप में प्रदर्शित होता है विशेष रूप से एक उत्तर चाहता था जो 'fetchall' –

+0

का उपयोग करने से बचा जाए लेकिन fetchALL दूसरों के अनुभव से स्मृति को बर्बाद कर देता है ... धन्यवाद :) –

+0

@MichaelSamuel क्यों? क्या आपको बेंचमार्क के रास्ते में सबूत मिला है कि 'fetchAll() '" स्मृति पर खराब "और" अपमानजनक "है, या क्या आप बस कहीं और पढ़ चुके हैं? मुझे लगता है कि एक 'fetchAll() 'एकाधिक' fetch()' से बेहतर है। –