2010-03-24 17 views
7

मैं अपने सभी php परियोजनाओं के लिए mysqli पर स्विच करने पर विचार कर रहा हूं। जिस तरह से मेरा कोड लिखा गया है (मैं बहुत ही सरल वेबसाइट चलाता हूं और अपना खुद का मूल रूपरेखा तैयार करता हूं जिसे मैं उन सभी में उपयोग करता हूं) मुझे कार्यों और कक्षाओं को संशोधित करने में बहुत सारी समस्याएं नहीं होनी चाहिए।mysqli पर एक अच्छा विचार स्विच करें?

हालांकि, मैंने केवल तैयार बयानों के बारे में सकारात्मक चीजें सुनाई हैं, उपलब्ध php कार्यों के बारे में कुछ grumblings बार, सबसे विशेष रूप से थोड़ी देर में mysql_fetch_array का उपयोग करने के लिए एक साधारण प्रतिस्थापन की कमी।

इसमें कुछ समय में बहुत ही अच्छा लगता है, इसलिए यदि किसी को भी इस तरह के गति और संसाधन उपयोग के रूप में तैयार बयान का उपयोग कर के साथ मुद्दों में से कुछ पर प्रकाश डाला सकता है मैंने सोचा।

उत्तर

2

तैयार कथन के लिए प्रोग्रामिंग का उपयोग करने में थोड़ा सा उपयोग होता है यदि आप केवल तारों को क्वेरी करने के लिए चर जोड़ना चाहते हैं। MySQL स्थितित्मक पैरामीटर का उपयोग करता है (आपकी क्वेरी में प्रश्न चिह्न होंगे जहां प्रतिस्थापन vars संबंधित हैं)। सबसे अच्छा शर्त यह है कि इसे अपने मौजूदा डेटाबेस अबास्ट्रक्शन में डालें। अगर वह अमूर्तता ठीक से लिखा गया था, तो आपको रैपर के बाहर mysql_fetch_array को कॉल नहीं करना चाहिए।

इस समस्या का समाधान केवल सभी पंक्तियों को इकट्ठा करना है, लेकिन निश्चित रूप से यह मानता है कि आप 1000 पंक्तियों को पुनर्प्राप्त नहीं करते हैं और केवल पहले के लिए पूछते हैं। यह एक बदलाव है जिसे आपको mysqli पर ध्यान दिए बिना करना चाहिए।

अंत में, कुछ बयानों आसानी पैरामीटर्स के आधार पर, इस तरह के तर्कों की चर संख्या के साथ in('x', 'y', 'z') सिंटैक्स का उपयोग क्वेरी के रूप में जगह नहीं कर रहे हैं। यह किया जा सकता है, लेकिन आप शायद अपने डेटाबेस अबास्ट्रक्शन को समृद्ध करना चाहते हैं ताकि वे क्वेरी बनाने के साथ-साथ उन्हें निष्पादित कर सकें।

प्रदर्शन, सुरक्षा के मामले में ट्रेडऑफ निश्चित रूप से इसके लायक है। PHP पक्ष पर अतिरिक्त प्रसंस्करण आमतौर पर माईएसक्यूएल पक्ष पर पूछताछ के लिए कैश निष्पादन योजनाओं से अधिक है, और आप सबसे आम एसक्यूएल इंजेक्शन भेद्यता के प्रति प्रतिरोधी हैं।

आशा है कि मदद करता है, जो

+0

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

2

तैयार बयान इतना अच्छा है कि यह भागने कार्यों फिर से उपयोग करने के लिए दर्दनाक है एक बार आप उन्हें आदत हो रहे हैं। अवधि।

हालांकि, सभी डीबी पुस्तकालयों (oci8 और sqlsrv सहित ...) मैं कभी कभी उपयोग किए गए मोड़ या किसी अन्य परिचय। इसलिए मैं मूल रूप से संपुटित जो कुछ भी पुस्तकालय मैं कस्टम वर्गों है कि रास्ते में सुविधाएँ उपलब्ध कराने का एक सरल सेट के साथ का उपयोग मुझे पसंद:

  • नाम आधारित पैरामीटर: WHERE foo = :foo
  • पैरामीटर साहचर्य सरणी में मूल्य द्वारा पारित (बल्कि व्यक्तिगत पीएचपी चर) बंधन से: $params = array('foo' => 33)
  • एक पंक्ति निष्पादन: $res = $Db->query($sql, $params);
  • resultsets वस्तुओं कि इटरेटर इंटरफ़ेस को लागू कर रहे हैं, इसलिए मैं के साथ पाश कर सकते हैं foreach($res as $row)

ऐसी नीति को अपनाने से सटीक वाक्यविन्यास या फ़ंक्शन सेट कम महत्वपूर्ण हो जाता है।

चाहे जो हो, जबकि इस लगभग किसी भी पुस्तकालय के साथ पूरा किया जा सकता है, यह मदद करता है अगर यह देशी परम (उदाहरण के लिए) आप डेटा प्रकार लगता है की जरूरत नहीं है तो बंधन प्रदान करता है।साथ ही, कुछ उन्नत कार्यक्षमता जैसे लेनदेन को सादा mysql कार्यों के साथ नहीं किया जा सकता है।

पीडीओ एक अच्छा विकल्प हो सकता था लेकिन इसके अधिकांश ड्राइवर मूल रूप से त्याग दिए जाते हैं ताकि आप वास्तव में डीबी-अज्ञेय अबास्ट्रक्शन परत होने का लाभ खो देते हैं जबकि आप इसे नुकसान पहुंचाते हैं।

आईएमएचओ, केवल तथ्य यह है कि आप पूछ रहे हैं कि आपको माइस्क्ली को मौका देना चाहिए।

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