2012-02-07 12 views
5

ठीक है मेरे वाक्यविन्यास को कोड के बिना शायद वर्णित किया जा सकता है। असल में यह आसान होना चाहिए ... लेकिन कभी नहीं है।

मेरे पास एक पंक्ति में 2 लूप हैं ... मूल रूप से वही बात। मैं अपने डेटाबेस से प्रत्येक चर * चुनता हूं, और फिर मुझे दो सीपी के आधार पर 2 परत जावास्क्रिप्ट बनाने की आवश्यकता है। चर।

तो

मेरे पास है:

while ($row = mysql_fetch_array($myVariable)) { 

// do events 

} 
तो उस

while ($row2 = mysql_fetch_array($myVariable)) { 

// do events 

} 

यह पूरी तरह से एक दूसरे पर कुछ भी नहीं लौटा रहा है किसी कारण से के बाद

... वहाँ कुछ मैं कहाँ की जरूरत है मेरी सरणी को रीसेट करें, क्या यह संभवतः समाप्त हो गया था और फिर मैं बस पुनरारंभ नहीं कर सकता। ऐसा एक बुनियादी सवाल है, लेकिन मैं यह नहीं समझ सकता कि मेरे जीवन के लिए और क्या गलत हो सकता है। तो सवाल यह है कि, एक सामान्य मुद्दा यह है कि एक पंक्ति में दो बार ऐसा करने के लिए और PHP की शुरूआत में प्रत्येक बार $ से शुरू होने की उम्मीद है जो मेरे चयन कथन रखती है?

धन्यवाद ... पूरे दिन जांच करेगा और आवश्यकतानुसार अद्यतन करेगा। स्टैक ओवरफ़्लो के लिए पहला टाइमर मुझे सहायता देखना अच्छा लगेगा।

+2

पहले डालने सब एक सरणी में रिकॉर्ड एक तो एक foreach कर – ZiTAL

+0

http://uk.php.net/mysql-fetch-array mysql_fetch_array आंतरिक डेटा सूचक ले जाता है, किसी को होशियार से मुझे इस अधिक समझा जाएगा , लेकिन मूल रूप से दूसरे लूप में आप पहले से ही अंत तक चले गए हैं! – TommyBs

+0

संभावित डुप्लिकेट प्रश्न: [दूसरा जबकि लूप नहीं चल रहा है। क्यों?] (Http://stackoverflow.com/questions/8333145/second-while-loop-not-running- क्यों) – Wiseguy

उत्तर

4

दूसरा पाश से पहले, mysql_data_seek() प्रयोग करके देखें:

mysql_data_seek($myVariable, 0); 

recordset में सूचक रीसेट होने की जरूरत है, अन्यथा यह अभी भी इंगित करेंगे कि यह अंत में है।

यह एक बेहतर विकल्प हो सकता है, जैसे कि ज़ीटाल बताता है, अपने रिकॉर्ड को सरणी में संग्रहीत करने के लिए और सरणी पर फिर से चालू करें।

+1

मुझे यह विकल्प पसंद है। जब आप पॉइंटर को शुरुआत में वापस रीसेट कर सकते हैं तो डेटा को सरणी में डालने की कोई आवश्यकता नहीं है।असल में आप केवल दो सरणी बना रहे हैं जब आपको केवल एक की आवश्यकता होती है और इसलिए अधिक मेमोरी का उपयोग करना! –

+0

@AngusWalker मुझे लगता है कि मुझे संभावित पठनीयता/रखरखाव के संदर्भ में "बेहतर" योग्यता प्राप्त करनी चाहिए। जैसा लिखा है, यह संदिग्ध है। – Wiseguy

0

यदि आपके लूप घोंसले हैं, और $ myVariable मानते हैं तो दोनों लूप के लिए समान है, बस इसे कॉपी करें और फिर प्रत्येक बार एक अलग प्रतिलिपि पर लूप करें।

$myVariable = mysql_result($query); 
$myVariable2 = $myVariable; 

while ($row = mysql_fetch_array($myVariable)) { 
    while ($row = mysql_fetch_array($myVariable2)) { 
... 

"इसे एक सरणी बनाने" के लिए एक और +1, हालांकि काम करने के लिए बहुत अच्छा है।

+0

मुझे लगता है कि पूछताछ के लूप घोंसला नहीं हैं। लेकिन अगर वे थे, तो आपके पास एक अच्छा मुद्दा है। – Wiseguy

+0

मैंने मुख्य रूप से इसे निहित किए जाने पर पोस्ट किया, और फिर पूरी तरह से उस हाहा का उल्लेख करना भूल गया। अच्छी पकड़ :) – Joe

7

समस्या यह है कि क्वेरी resource देता है। इस संसाधन में इसका अपना आंतरिक सूचक है (याद रखने के लिए कि कौन सी पंक्ति वापस आती है)। mysql_fetch_array उस आंतरिक सूचक को अग्रिम करेगा और प्रत्येक पंक्ति को एक समय में संसाधन से वापस कर देगा। एक बार यह अंत में होता है (कोई और पंक्तियां नहीं छोड़ी जाती हैं), यह झूठी होती है। तो आखिरी पाश पर, $ पंक्ति झूठ के बराबर होती है जो थोड़ी देर लूप से निकलती है। हालांकि सूचक को रीसेट नहीं किया गया है। तो अगली बार लूप पर, आप mysql_fetch_array को कॉल करते हैं, पॉइंटर अंत में होता है और इसलिए यह झूठी रिटर्न देता है जो लूप को दूसरी बार पूरी तरह से बाईपास करता है। आपको क्या करना चाहिए, एक बार डेटा के माध्यम से लूप है और प्रत्येक पंक्ति को सरणी में स्टोर करें। फिर आप सरणी पर जितना चाहें उतना कॉपी/लूप कर सकते हैं और सब कुछ अपेक्षित काम करता है।

$data = array(); 
while ($row = mysql_fetch_array($myVariable)) { 
    $data[] = $row; 
} 
//now $data has all the rows. a simple foreach will loop over the data. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 

//and you can loop over data again and again. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 
संबंधित मुद्दे