Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

आपको डाटाबेस एक्सेस के लिए PHP PDO का उपयोग क्यों करना चाहिए?

by
Difficulty:IntermediateLength:LongLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

कई PHP प्रोग्रामर ने या तो MySQL या MySQLi एक्सटेंशन का उपयोग करके डेटाबेस का उपयोग करना सीख लिया है। PHP 5.1 के अनुसार, एक बेहतर तरीका है। PHP डाटा ऑब्जेक्ट्स (PDO) तैयार statements के लिए तरीके प्रदान करते हैं और ऑब्जेक्ट्स के साथ काम करते हैं जो आपको अधिक उत्पादक बना देगा!

पुनर्प्रकाशित ट्यूटोरियल

हर कुछ हफ्तों में, हम साइट के पूरे इतिहास में से कुछ हमारे पाठक की पसंदीदा पोस्ट की समीक्षा करते हैं। यह ट्यूटोरियल पहले मई 2010 में प्रकाशित हुआ था।


PDO परिचय

"PDO - PHP डाटा ऑब्जेक्ट्स - एक डाटाबेस एक्सेस लेयर है जो एक से अधिक डाटाबेस तक पहुंच की समान पद्धति प्रदान करता है।"

यह डेटाबेस-विशिष्ट सिंटैक्स के लिए खाता नहीं है, लेकिन कई उदाहरणों में कनेक्शन स्ट्रिंग स्विच करके, डेटाबेस और प्लेटफ़ॉर्म को काफी दर्द रहित होने के लिए स्विच करने की प्रक्रिया की अनुमति दे सकता है

PDO - db abstraction layer

इस ट्यूटोरियल का मतलब SQL पर पूरा करने के लिए नहीं है यह मुख्य रूप से उन लोगों के लिए लिखा गया है जो वर्तमान में mysql या mysqli एक्सटेंशन का उपयोग करके उन्हें अधिक पोर्टेबल और शक्तिशाली PDO में कूदने में मदद करते हैं।

डेटाबेस समर्थन

एक्सटेंशन किसी ऐसे डेटाबेस को समर्थन कर सकता है जो PDO चालक के लिए लिखा गया है। इस लेखन के समय, निम्नलिखित डेटाबेस ड्राइवर उपलब्ध हैं:

  • PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )
  • PDO_FIREBIRD ( Firebird/Interbase 6 )
  • PDO_IBM ( IBM DB2 )
  • PDO_INFORMIX ( IBM Informix Dynamic Server )
  • PDO_MYSQL ( MySQL 3.x/4.x/5.x )
  • PDO_OCI ( Oracle Call Interface )
  • PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )
  • PDO_PGSQL ( PostgreSQL )
  • PDO_SQLITE ( SQLite 3 and SQLite 2 )
  • PDO_4D ( 4D )

इन सभी ड्राइवर आपके सिस्टम पर जरूरी उपलब्ध नहीं हैं; यह जानने का एक त्वरित तरीका है कि आपके पास कौन से ड्राइवर हैं:


कनेक्ट करना

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

Connection String

कृपया प्रयास / पकड़ ब्लॉक का ध्यान रखें - आपको हमेशा अपने पीडीओ संचालन को एक प्रयास / पकड़ में लपेटकर अपवाद तंत्र का उपयोग करना चाहिए - इस पर अधिक शीघ्र ही आमतौर पर आप केवल एक ही कनेक्शन बनाने जा रहे हैं - आपको सिंटैक्स दिखाने के लिए कई सूचीबद्ध हैं। $ डीबीएच 'डेटाबेस संभाल' के लिए खड़ा है और इस ट्यूटोरियल के दौरान उपयोग किया जाएगा।

आप हैंडल को रिक्त करने के लिए किसी भी कनेक्शन को बंद कर सकते हैं।

आप PHP.net से अन्य डेटाबेस के लिए डेटाबेस विशिष्ट विकल्प और / या कनेक्शन स्ट्रिंग्स पर अधिक जानकारी प्राप्त कर सकते हैं।


Exceptions और PDO

पीडीओ त्रुटियों को संभालने के लिए अपवादों का उपयोग कर सकता है, जिसका मतलब है कि पीडीओ के साथ जो कोई भी आप करते हैं वह एक प्रयास / पकड़ ब्लॉक में लपेटा जाना चाहिए। आप PDO को अपने नए बनाए गए डेटाबेस हैंडल पर त्रुटि मोड विशेषता को सेट करके तीन त्रुटि मोड में से एक में बाध्य कर सकते हैं। यहाँ वाक्यविन्यास है:

कोई फर्क नहीं पड़ता कि आपने जो त्रुटि मोड सेट किया है, एक त्रुटि जोड़ने से हमेशा कोई अपवाद उत्पन्न होगा, और एक कनेक्शन बनाने के प्रयास / पकड़ ब्लॉक में हमेशा शामिल होना चाहिए।

PDO::ERRMODE_SILENT

यह डिफ़ॉल्ट त्रुटि मोड है यदि आप इसे इस मोड में छोड़ देते हैं, तो आपको त्रुटियों की जांच करने के लिए जिस तरह से संभवतः आप उपयोग किए जाते हैं, यदि आपने mysql या mysqli एक्सटेंशन का उपयोग किया है अन्य दो विधियां सूखी प्रोग्रामिंग के लिए अधिक आदर्श हैं

PDO::ERRMODE_WARNING

यह मोड एक मानक PHP चेतावनी जारी करेगा, और प्रोग्राम को निष्पादन जारी रखने की अनुमति देगा। यह डीबगिंग के लिए उपयोगी है

PDO::ERRMODE_EXCEPTION

यह वह विधा है जिसे आपको अधिकतर स्थितियों में देखना चाहिए। यह एक अपवाद सक्रिय करता है, जिससे आप त्रुटियों को अच्छी तरह से संभाल सकते हैं और डेटा छुपा सकते हैं जो कि किसी को आपके सिस्टम का फायदा उठाने में मदद कर सकता है। यहां अपवादों का लाभ लेने का एक उदाहरण है:

चयन बयान में एक जानबूझकर त्रुटि है; यह एक अपवाद पैदा करेगा अपवाद एक लॉग फ़ाइल में त्रुटि का ब्योरा भेजता है, और प्रयोक्ता को एक मैत्रीपूर्ण (या इतना अनुकूल नहीं) संदेश दिखाता है


Insert and Update

नया डेटा डालना, या मौजूदा डेटा को अपडेट करना अधिक सामान्य डेटाबेस परिचालनों में से एक है। पीडीओ का उपयोग करना, यह आम तौर पर दो-चरण की प्रक्रिया है। इस खंड में शामिल सभी चीजें अद्यतन और INSERT संचालन दोनों के लिए समान रूप से लागू होती हैं।

2 to 3 step insert and update

यहाँ सबसे बुनियादी प्रकार के डालने का एक उदाहरण है:

आप एक कम कॉल के साथ, exec () विधि का उपयोग करके एक ही ऑपरेशन भी पूरा कर सकते हैं। ज्यादातर स्थितियों में, आप लंबे समय तक विधि का उपयोग करने जा रहे हैं ताकि आप तैयार बयानों का लाभ उठा सकें। यहां तक कि अगर आप इसे केवल एक बार उपयोग करने जा रहे हैं, तो तैयार बयानों का उपयोग करके आपको एसक्यूएल इंजेक्शन हमलों से बचाने में मदद मिलेगी।

Prepared Statements

तैयार बयानों का उपयोग करना आपको एसक्यूएल इंजेक्शन से बचाने में मदद करेगा।

एक तैयार कथन एक precompiled SQL कथन है जो सर्वर पर केवल डेटा भेजकर कई बार निष्पादित किया जा सकता है। एसक्यूएल इंजेक्शन हमलों से सुरक्षित जगह प्लेसहोल्डर्स में इस्तेमाल किए गए डेटा को स्वचालित रूप से बनाने का अतिरिक्त लाभ है।

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

आप पहली विधि से बचना चाहते हैं; यह तुलना के लिए यहाँ है नाम या अनाम प्लेसहोल्डर का उपयोग करने पर आपको यह प्रभावित होगा कि आप उन बयानों के लिए डेटा कैसे सेट करते हैं।

Unnamed Placeholders

यहां दो चरण हैं सबसे पहले, हम विभिन्न प्लेसहोल्डर (लाइन 2-4) के लिए वेरिएबल्स देते हैं। उसके बाद, हम उन प्लेसहोल्डर के लिए मूल्य असाइन करते हैं और कथन निष्पादित करते हैं। डेटा के दूसरे समूह को भेजने के लिए, उन चर के मूल्यों को बदल कर और फिर से कथन निष्पादित करें।

क्या यह कई मापदंडों के साथ बयानों के लिए थोड़ा सा बोझ लग रहा है? यह है। हालांकि, यदि आपका डेटा किसी सरणी में संग्रहीत है, तो एक आसान शॉर्टकट है:

यह आसान है!

सरणी में मौजूद डेटा प्लेसहोल्डर को क्रम में लागू होता है। $ डेटा [0] पहले प्लेसहोल्डर में जाता है, $ डेटा [1] दूसरा, आदि। हालांकि, यदि आपके सरणी अनुक्रमणिका क्रम में नहीं हैं, तो यह ठीक से काम नहीं करेगा, और आपको सरणी को पुन: अनुक्रमणिका की आवश्यकता होगी।

Named Placeholders

आप शायद वाक्यविन्यास अनुमान लगा सकते हैं, लेकिन यहां एक उदाहरण है:

आप यहाँ भी एक शॉर्टकट का उपयोग कर सकते हैं, लेकिन यह एसोसिएटिव एरेज़ के साथ काम करता है। यहां एक उदाहरण है:

आपके सरणी की कुंजी को कोलन से शुरू करने की आवश्यकता नहीं है, लेकिन अन्यथा नामित प्लेसहोल्डर से मेल खाने की आवश्यकता है। यदि आपके पास सरणियों की एक सरणी है, तो आप उन पर पुनरावृति कर सकते हैं, और केवल डेटा के प्रत्येक सरणी के साथ निष्पादित कर सकते हैं।

नामित जगहधारकों की एक और अच्छी सुविधा है कि वस्तुओं को सीधे अपने डेटाबेस में सम्मिलित करने की क्षमता है, मान ली गई गुण नामांकित क्षेत्रों से मेल खाती हैं। यहां एक उदाहरण ऑब्जेक्ट है, और आप अपने डालने का काम कैसे करेंगे:

ऑब्जेक्ट को ऑब्जेक्ट को निष्पादित करने में सरणी के रूप में, गुणों को सरणी कुंजियों के रूप में माना जाता है।


Selecting Data

Fetch data into arrays or objects

डेटा -> fetch (), आपके कथन की एक विधि के माध्यम से प्राप्त किया जाता है। कॉलिंग लाए जाने से पहले, पीडीओ को बताएं कि आपको डाटा कैसे प्राप्त करना है आपके पास निम्न विकल्प हैं:

  • PDO::FETCH_ASSOC: स्तंभ नाम से अनुक्रमित सरणी देता है
  • PDO::FETCH_BOTH (default): कॉलम नाम और संख्या दोनों से अनुक्रमित एक सरणी देता है
  • PDO::FETCH_BOUND: अपने कॉलम के मान को -> बाइंड कॉलम () के साथ निर्धारित चर में निर्दिष्ट करता है
  • PDO::FETCH_CLASS: नामांकित क्लास के गुणों के लिए अपने कॉलम के मान को असाइन करता है। यह मिलान गुणों के गुणों का अस्तित्व नहीं बनाएगा
  • PDO::FETCH_INTO: नामांकित कक्षा के एक मौजूदा उदाहरण को अपडेट करता है
  • PDO::FETCH_LAZY: जोड़ता है PDO::FETCH_BOTH/PDO::FETCH_OBJ, ऑब्जेक्ट वेरिएबल नाम बनाने के लिए जैसे वे उपयोग किए जाते हैं
  • PDO::FETCH_NUM: स्तंभ संख्या से अनुक्रमित एक सरणी देता है
  • PDO::FETCH_OBJ: संपत्ति के नाम के साथ एक अज्ञात वस्तु देता है जो स्तंभ नामों के अनुरूप होता है

वास्तव में, तीन स्थितियां हैं जो सबसे अधिक परिस्थितियों को कवर करेंगे: FETCH_ASSOC, FETCH_CLASS, और FETCH_OBJ फ़ेच विधि सेट करने के लिए, निम्न सिंटैक्स का उपयोग किया जाता है:

आप फ़ैच प्रकार को सीधे -> फ़ेच () विधि कॉल के भीतर सेट कर सकते हैं।

FETCH_ASSOC

यह फ़ैच प्रकार एक एसोसिएटिव सरणी बनाता है, जिसे स्तंभ नाम से अनुक्रमित किया गया है। यह उन सभी के लिए काफी परिचित होना चाहिए जिनके पास mysql / mysqli एक्सटेंशन हैं इस पद्धति के साथ डेटा का चयन करने का एक उदाहरण यहां दिया गया है:

जबकि लूप परिणाम पूरा होने तक एक पंक्ति में एक पंक्ति सेट करना जारी रखेगा।

FETCH_OBJ

यह फ़ेच प्रकार, प्राप्त किए गए डेटा की प्रत्येक पंक्ति के लिए एसटीडी कक्षा का एक वस्तु बनाता है। यहां एक उदाहरण है:

FETCH_CLASS

आपके ऑब्जेक्ट के गुणों को निर्माता से पहले सेट किया जाता है। यह महत्वपूर्ण है।

यह फ़ेच विधि आपको सीधे आपके चयन के एक वर्ग में डेटा लाने की अनुमति देता है। जब आप FETCH_CLASS का उपयोग करते हैं, तो आपके ऑब्जेक्ट के गुणों को कंसट्रेटर से पहले सेट किया जाता है। इसे फिर से पढ़ें, यह महत्वपूर्ण है यदि कॉलम के नाम से सम्पन्न गुण मौजूद नहीं हैं, तो उन गुणों को आपके लिए (सार्वजनिक रूप से) बनाया जाएगा

इसका मतलब यह है कि यदि आपके डेटा को डेटाबेस से बाहर आने के बाद किसी भी परिवर्तन की आवश्यकता होती है, तो यह प्रत्येक ऑब्जेक्ट के रूप में आपके ऑब्जेक्ट द्वारा स्वचालित रूप से किया जा सकता है।

एक उदाहरण के रूप में, ऐसी स्थिति की कल्पना करें जहां प्रत्येक रिकॉर्ड के लिए पता को आंशिक रूप से अस्पष्ट होना चाहिए। हम उस संपत्ति पर कन्स्ट्रक्टर में संचालन करके ऐसा कर सकते थे। यहां एक उदाहरण है:

जैसा कि डेटा को इस वर्ग में लाया जाता है, पते में उसके सभी लोअरकेस ए-जेड अक्षरों को अक्षर x द्वारा प्रतिस्थापित किया गया है। अब, कक्षा का उपयोग करना और उस आंकड़े को बदलना पूरी तरह पारदर्शी है:

यदि पता '5 गुलाबबॉउड' था, तो आप अपने आउटपुट के रूप में '5 राxxxxxx' देखेंगे। बेशक, ऐसे हालात भी हो सकते हैं, जहां डेटा निर्दिष्ट किए जाने से पहले आपको कन्स्ट्रक्टर कहा जाता है। पीडीओ ने आपने इसके लिए भी कवर किया है

अब, जब आप पिछली उदाहरण को इस फैच मोड (पीडीओ :: FETCH_PROPS_LATE) के साथ दोहराते हैं तो पते को अस्पष्ट नहीं किया जाएगा, क्योंकि कन्स्ट्रक्टर को बुलाया गया था और गुणों को सौंपा गया था।

अंत में, अगर आपको वास्तव में आवश्यकता है, तो आप PDO के साथ ऑब्जेक्ट्स में डेटा लाते समय कन्स्ट्रक्टर को तर्क दे सकते हैं:

यदि आपको प्रत्येक ऑब्जेक्ट के लिए कन्स्ट्रक्टर को अलग-अलग डाटा पास करने की आवश्यकता है, तो आप फ़ेच विधि के भीतर फ़ेच मोड सेट कर सकते हैं:


कुछ अन्य सहायक तरीकों

हालांकि यह पीडीओ में सब कुछ कवर करने के लिए नहीं है (यह एक विशाल एक्सटेंशन है!) पीडीओ के साथ बुनियादी चीजों को करने के लिए आपको कुछ और तरीकों के बारे में जानना चाहिए।

-> अंतिम सम्मिलित करें आईडी () विधि हमेशा डेटाबेस संभाल पर कहा जाता है, बयान को संभाल नहीं करता, और उस कनेक्शन द्वारा अंतिम डाली गई पंक्ति की स्वत: वृद्धि हुई आईडी लौटाएगा।

-> exec () विधि का इस्तेमाल उन कार्यों के लिए किया जाता है जो अन्य डेटा को प्रभावित नहीं कर सकता है, फिर प्रभावित पंक्तियां। उपरोक्त exec विधि का उपयोग करने के दो उदाहरण हैं।

-> उद्धरण () विधि स्ट्रिंग उद्धरण करती है ताकि वे प्रश्नों में उपयोग करने के लिए सुरक्षित हो। यह आपका फ़ॉलबैक है यदि आप तैयार बयान का उपयोग नहीं कर रहे हैं

-> पंक्तिकोटा () विधि एक पूर्णांक देता है जो किसी ऑपरेशन से प्रभावित पंक्तियों की संख्या को दर्शाता है। [इस बग रिपोर्ट] (http://bugs.php.net/40822) के अनुसार पीडीओ के कम से कम एक ज्ञात संस्करण में यह विधि चयन बयान के साथ काम नहीं करती है। यदि आपको यह समस्या हो रही है, और PHP को अपग्रेड नहीं कर सकता है, तो आप निम्न के साथ पंक्तियों की संख्या प्राप्त कर सकते हैं:


निष्कर्ष

मुझे उम्मीद है कि इससे आप में से कुछ MySQL और mysqli एक्सटेंशन से दूर हो जाएंगे। तुम क्या सोचते हो? क्या आप में से कोई भी वहाँ स्विच कर सकता है?

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.