2008-09-23 12 views
24

अब जबकि एक छोटे के लिए PHP/MySQL का उपयोग कर दिया गया है, और अगर कोई विशिष्ट लाभ (प्रदर्शन या अन्यथा) कर रहे हैं मैं सोच रहा हूँ mysql_fetch_object() बनाम mysql_fetch_assoc()/mysql_fetch_array() का उपयोग कर सकते हैं।MySQL परिणाम PHP - arrays या ऑब्जेक्ट्स में परिणाम?

उत्तर

35

प्रदर्शन-वार इससे कोई फर्क नहीं पड़ता कि आप क्या उपयोग करते हैं। अंतर यह है कि mysql_fetch_object रिटर्न आपत्ति है:

while ($row = mysql_fetch_object($result)) { 
    echo $row->user_id; 
    echo $row->fullname; 
} 

mysql_fetch_assoc() साहचर्य सरणी देता है:

while ($row = mysql_fetch_array($result)) { 
    echo $row[0]; 
    echo $row[1] ; 
} 
+0

असल में, यह आपकी वरीयता पर निर्भर करता है। – davethegr8

+7

छोटे अंतर, _row रिटर्न 0,1 .. और _array रिटर्न 'userid', 'fullname', '0', '1'। – Shinhan

+0

mysql_fetch_array के दूसरे तर्क में आप उस मौसम को निर्दिष्ट कर सकते हैं जिसे आप सहयोगी परिणाम, संख्यात्मक परिणाम या दोनों (परिणामस्वरूप एक सरणी सूचकांक मान) परिणाम –

4

mysql_fetch_array() के साथ एक सरणी प्राप्त करना आपको फ़ोरैच लूप या लूप के माध्यम से परिणाम सेट को लूप करने देता है। mysql_fetch_object() को लूप द्वारा पार नहीं किया जा सकता है।

सुनिश्चित नहीं है कि इससे भी ज्यादा मायने रखता है, सिर्फ सोचा कि मैं इसका उल्लेख करूंगा।

+7

ऑब्जेक्ट गुणों को php5 + – Owen

+3

में foreach के माध्यम से पुनरावृत्त किया जा सकता है जबकि ($ row = mysql_fetch_object ($ परिणाम)) काम करता है। इसका उपयोग mysql_fetch_array() के समान है, सिवाय इसके कि आप $ पंक्ति-> फ़ील्ड के बजाय $ पंक्ति ['फ़ील्ड'] के बजाय पहुंच सकते हैं। – cubex

+0

ओवेन, यही वही है जो मैंने कहा था। –

0

मुझे लगता है कि इन सभी कार्यों के बीच का अंतर महत्वहीन है, खासकर जब कोड पठनीयता की तुलना में।

यदि आप इस तरह के अनुकूलन के बारे में चिंतित हैं, तो mysql_fetch_row() का उपयोग करें। यह सबसे तेज़ है क्योंकि यह सहयोगी सरणी (उदा। $ पंक्ति [2]) का उपयोग नहीं करता है, लेकिन इसके साथ अपना कोड तोड़ना सबसे आसान है।

1
while ($Row = mysql_fetch_object($rs)) { 
    // ...do stuff... 
} 

... यह है कि मैंने हमेशा इसे कैसे किया है। मैं सरणी के बजाय डेटा के संग्रह के लिए ऑब्जेक्ट्स का उपयोग करना पसंद करता हूं, क्योंकि यह डेटा को थोड़ा बेहतर तरीके से व्यवस्थित करता है, और मुझे पता है कि किसी ऑब्जेक्ट में मनमाने ढंग से गुण जोड़ने की कोशिश करने की संभावना बहुत कम है, मैं इंडेक्स जोड़ने की कोशिश कर रहा हूं एक सरणी के लिए (पहले कुछ वर्षों के लिए मैंने PHP का उपयोग किया, मैंने सोचा कि आप किसी वस्तु को मनमाने ढंग से गुण नहीं दे सकते हैं, इसलिए यह ऐसा करने के लिए बाध्य नहीं है)।

+0

मैंने वास्तव में जंगली में ऐसा कोड नहीं देखा है। –

0

गति के लिहाज से, mysql_fetch_object() समान होता है:

while ($row = mysql_fetch_assoc($result)) { 
    echo $row["userid"]; 
    echo $row["fullname"]; 
} 

और mysql_fetch_array() सरणी देता है mysql_fetch_array() पर, और लगभग mysql_fetch_row() जितनी जल्दी हो सके।

इसके अलावा, mysql_fetch_object() के साथ आप केवल फ़ील्ड डेटा को इसी क्षेत्र के नाम से एक्सेस कर पाएंगे।

-2

मैं mysql_fetch_array()

खिलाफ वोट क्योंकि तुम वापस संख्यानुसार अनुक्रमित स्तंभ और स्तंभ नाम दोनों मिलता है, यह एक सरणी है कि बड़े रूप में दो बार पैदा करता है। यह ठीक है अगर आपको अपना कोड डीबग करने और इसकी सामग्री को देखने की आवश्यकता नहीं है। लेकिन हममें से बाकी के लिए, डीबग करना मुश्किल हो जाता है क्योंकि आपको अजीब दिखने वाले प्रारूप में दो गुना अधिक डेटा से गुजरना पड़ता है।

मैं कभी-कभी एक प्रोजेक्ट में चलाता हूं जो इस समारोह का उपयोग करता है, जब मैं डीबग करता हूं, मुझे लगता है कि कुछ गलत हो गया है क्योंकि मेरे डेटा के साथ संख्यात्मक कॉलम मिश्रित हैं। , सरणियों आसानी से एक मेमोरी कैश (eAccelerator, XCache में जोड़ा जा सकता:

तो विवेक के नाम पर, इस समारोह का उपयोग नहीं करें, यह कोड रखरखाव और अधिक कठिन

+4

mysql_fetch_array() का उपयोग करना चाहिए संख्यात्मक और सहयोगी सूचकांक दोनों के साथ एक सरणी देता है; संपूर्ण परिवार के लिए मजा। – hlpiii

+0

आह आपका अधिकार! मैं एक और समारोह के बारे में सोच रहा था। मैंने अपना जवाब संशोधित किया – SeanDowney

5

को ध्यान में रखना कुछ बना देता है। ।), जबकि ऑब्जेक्ट्स नहीं कर सकते हैं (जब उन्हें प्रत्येक पुनर्प्राप्ति पर भंडारण और अनुक्रमित किया जाता है तो उन्हें धारावाहिक प्राप्त करने की आवश्यकता होती है!)।

जब आप मेमोरी कैश समर्थन जोड़ना चाहते हैं तो आप वस्तुओं के बजाय सरणी का उपयोग करने के लिए स्विच कर सकते हैं - लेकिन उस समय तक आपको पहले से ही बहुत से कोड को बदलना पड़ सकता है, जो पहले इस्तेमाल किए गए ऑब्जेक्ट प्रकार रिटर्न मानों का उपयोग करता है।

+1

अच्छा बिंदु (मेमोरी कैश समर्थन)। विषय पर सबसे अच्छे उत्तर के लिए –

30

mysql_fetch_array आपके कोड को पढ़ने के लिए मुश्किल बनाता है = एक रखरखाव दुःस्वप्न। आप एक नज़र में नहीं देख सकते कि आपका ऑब्जेक्ट किस डेटा से निपट रहा है। यह थोड़ा तेज़ है, लेकिन यदि यह आपके लिए महत्वपूर्ण है तो आप इतना डेटा संसाधित कर रहे हैं कि PHP शायद जाने का सही तरीका नहीं है।

mysql_fetch_object में कुछ कमीएं हैं, खासकर यदि आप उस पर एक डीबी परत का आधार रखते हैं।

  • कॉलम नाम मान्य पीएचपी पहचानकर्ता, उदा tax-allowance या user.id अगर अपने डेटाबेस ड्राइवर आप क्वेरी में विनिर्दिष्ट स्तंभ नाम देता है नहीं हो सकता। फिर आपको जगह पर {} का उपयोग शुरू करना होगा।

  • आप अपने नाम के आधार पर एक स्तंभ प्राप्त करना चाहते हैं, कुछ चर में stroed आप वेरिएबल गुण $row->{$column_name} का उपयोग शुरू करने, जबकि सारणी वाक्य-विन्यास $row[$column_name]

  • कंस्ट्रक्टर्स लागू नहीं मिलता जब आप उम्मीद कर सकते यदि आप कक्षा का नाम निर्दिष्ट करते हैं।

  • यदि आप कक्षा का नाम निर्दिष्ट नहीं करते हैं तो आपको stdClass मिलता है, जो कि किसी भी सरणी से शायद ही बेहतर है।

mysql_fetch_assoc तीन का सबसे आसान के साथ काम करने है, और मैं भेद इस वस्तुओं और डेटाबेस परिणाम पंक्तियां के बीच कोड में देता है ... चाहते

$object->property=$row['column1']; 
$object->property=$row[$column_name]; 
foreach($row as $column_name=>$column_value){...} 

जबकि कई OOP प्रशंसक (और मैं एक ओओपी प्रशंसक हूं) सब कुछ को किसी ऑब्जेक्ट में बदलने के विचार की तरह, मुझे लगता है कि एसोसिएटिव सरणी किसी ऑब्जेक्ट की तुलना में डेटाबेस से एक पंक्ति का बेहतर मॉडल है, क्योंकि मेरे दिमाग में ऑब्जेक्ट गुणों का एक सेट है उन पर कार्य करने के तरीके, जबकि पंक्ति केवल डेटा है और इसे बिना किसी जटिलता के माना जाना चाहिए tion।

+3

+1। मैं assoc का उपयोग करता था, तो मैं वस्तुओं (सभी वस्तुओं को बनाने के प्रयास में) के लिए स्विच किया, लेकिन आपने कहा कारणों के लिए assoc वापस स्विच किया है; यह एक वस्तु के मुकाबले एक सरणी के रूप में डेटा की तरह दिखता है। –

+0

@ जे.मोनी लेकिन जब आप वास्तव में डेटाबेस परिणामों पर स्विच करते हैं तो ऑब्जेक्ट्स द्वारा प्रदर्शित किया जा रहा है? जैसे कि सक्रिय रिकॉर्ड पैटर्न में, मैं पसंद करता हूं कि फ्रंट एंड पहले से ही ऑब्जेक्ट इंटरफेस का उपयोग कर रहा है। $ उपयोगकर्ता = उपयोगकर्ता :: ढूंढें (1), फिर फ्रंट एंड पर अगर यह पहले से ही उपयोगकर्ता-> ईमेल के रूप में लागू किया गया है, तो कोई बदलाव नहीं किया जा सकता है। यह परिणामों पर अग्रभाग से विधियों को बुलाए जाने के लिए आपको अधिक लचीलापन देता है। यद्यपि ऑब्जेक्ट्स को $ उपयोगकर्ता ['ईमेल'] बनाने के लिए ऑब्जेक्ट इंटरफ़ेस को लागू करने के लिए ऑब्जेक्ट बनाने के लिए अभी भी बहुत छोटा है, ऑब्जेक्ट को $ user-> ईमेल के रूप में सटीक वही काम करता है .. – Anther

+0

@ अन्य जादू विधियां सक्रिय को कार्यान्वित करने में आसान बनाती हैं पंक्ति डेटा को पकड़ने के लिए सरणी का उपयोग करके रिकॉर्ड करें। आप सही हैं हालांकि PHP ओओपी की तरफ आगे बढ़ता है mysql_fetch_ * के कार्यान्वयन के दृश्यों के पीछे हो रहा है और इसलिए यह छोटा है कि एक या दूसरे का उपयोग किया जाता है या नहीं। असल में, इस बारे में सोचने का एकमात्र कारण यह था क्योंकि मैं किसी ऑब्जेक्टिव कोड को फिर से लिख रहा हूं ताकि अधिक ऑब्जेक्ट उन्मुख हो और यह डेटाबेस एब्स्ट्रक्शन लेयर का उपयोग न करे। वे सभी mysql_fetch_ * कार्यों का उपयोग पूरे बिना किसी स्पष्ट पैटर्न के करते हैं। –

2

इसके अतिरिक्त, यदि आप अंततः अपने MySQL परिणामों में मेमकैचिंग लागू करना चाहते हैं, तो आप सरणी चुनना चाहेंगे। ऐसा लगता है कि ऑब्जेक्ट प्रकार के परिणामों के बजाय सरणी प्रकारों को स्टोर करना सुरक्षित है।

संबंधित मुद्दे