Drupal 7 — PHP PDO के माध्यम से डेटाबेस के साथ काम
Drupal 7 में जाने के साथ, हम नए Drupal Database Abstraction Layer API पर भी जाते हैं, जो PHP PDO पर आधारित है। PDO पहले से ही Zend Framework और कई अन्य PHP फ्रेमवर्क्स में उपयोग किया जा रहा है। Drupal 6 में SQL क्वेरी लिखना बहुत आसान था — तो हमें कुछ नया क्यों चाहिए?
पहले यह समझते हैं कि PDO क्या है।
Drupal 7 में डेटाबेस के साथ काम — पाठ 1 — Drupal DB API
यदि आपने Drupal 6 के लिए मॉड्यूल लिखे हैं, तो आपके लिए नए Drupal 7 Database API पर स्विच करना कठिन नहीं होगा। नया DB API PHP के PDO एक्सटेंशन पर आधारित है, जिससे यह विभिन्न डेटाबेस जैसे MySQL, PostgreSQL, MSSQL और यहां तक कि Oracle के साथ भी काम कर सकता है। यद्यपि इसका सिंटैक्स थोड़ा नया है और इसकी आदत डालने में समय लगता है, फिर भी यह काफी शक्तिशाली है।
यहाँ Drupal की आधिकारिक डॉक्यूमेंटेशन से कुछ अंश दिए गए हैं:
Drupal 7 में डेटाबेस के साथ काम — पाठ 2 — डेटाबेस कॉन्फ़िगरेशन
Drupal में डेटाबेस से कनेक्शन निर्धारित करने का मुख्य साधन settings.php में मौजूद $databases ऐरे है। जैसा कि नाम से स्पष्ट है, $databases आपको एक से अधिक डेटाबेस कनेक्शन परिभाषित करने की अनुमति देता है। यह कई “targets” (लक्ष्यों) को भी सपोर्ट करता है। ध्यान दें कि कनेक्शन वास्तव में तब तक नहीं बनता जब तक कोई कोड डेटाबेस पर पहली बार क्वेरी नहीं चलाता।
Drupal 7 में डेटाबेस के साथ काम — पाठ 3 — स्टैटिक क्वेरीज़ (SELECT)
Drupal में सबसे सामान्य क्वेरी प्रकार है स्टैटिक क्वेरी। ऐसी क्वेरी डेटाबेस को बिल्कुल उसी रूप में भेजी जाती है जैसे लिखी गई हो। केवल SELECT क्वेरीज़ ही स्टैटिक हो सकती हैं।
स्टैटिक क्वेरीज़ का उपयोग केवल बहुत सरल मामलों में करना चाहिए। यदि आपको जटिल, डायनेमिक रूप से निर्मित, या रनटाइम पर संशोधित की जाने वाली क्वेरीज़ चाहिए, तो आपको डायनेमिक क्वेरीज़ का उपयोग करना चाहिए।
स्टैटिक क्वेरी चलाने का सरल तरीका है:
Drupal 7 में डेटाबेस के साथ काम — पाठ 4 — डायनेमिक क्वेरीज़ (SELECT)
अब हम Drupal Database API के सबसे दिलचस्प भाग — डायनेमिक क्वेरीज़ — तक पहुँच गए हैं। इन्हें “डायनेमिक” इसलिए कहा जाता है क्योंकि Drupal क्वेरी स्ट्रिंग को स्वतः तैयार करता है। सभी INSERT, UPDATE, DELETE और MERGE क्वेरीज़ डायनेमिक हो सकती हैं। SELECT क्वेरीज़ भी या तो स्टैटिक या डायनेमिक हो सकती हैं, लेकिन Drupal में SELECT के लिए भी डायनेमिक क्वेरीज़ का उपयोग करना बेहतर होता है।
Drupal 7 में डेटाबेस के साथ काम — पाठ 5 — एक्सटेंडर्स (Extenders)
Drupal 7 में SELECT क्वेरीज़ “एक्सटेंडर्स (Extenders)” का समर्थन करती हैं। एक्सटेंडर का उपयोग किसी क्वेरी में अतिरिक्त कार्यक्षमता जोड़ने के लिए किया जाता है — यह रनटाइम पर क्वेरी की क्षमताओं को बढ़ाता है। एक्सटेंडर किसी क्वेरी ऑब्जेक्ट में नए मेथड्स जोड़ सकते हैं या मौजूदा मेथड्स के व्यवहार को संशोधित कर सकते हैं।
यह अवधारणा ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के Decorator Pattern पर आधारित है। एक्सटेंडर किसी क्वेरी ऑब्जेक्ट में अतिरिक्त “ज़िम्मेदारियाँ” जोड़ते हैं, जिससे उस ऑब्जेक्ट की क्षमताएँ बिना उसका मूल क्लास बदले विस्तारित हो जाती हैं।
Drupal 7 में डेटाबेस के साथ काम — पाठ 6 — रनटाइम पर क्वेरी संशोधन (hook_query_alter)
ड्रुपल 7 में डायनेमिक SELECT क्वेरी की एक महत्वपूर्ण विशेषता यह है कि अन्य मॉड्यूल्स रनटाइम पर (यानी “ऑन द फ्लाई”) क्वेरी को संशोधित कर सकते हैं। इससे दूसरे मॉड्यूल्स अपने निर्देश क्वेरी में जोड़ सकते हैं, ताकि वे इसके व्यवहार को बदल सकें — उदाहरण के लिए, नोड एक्सेस नियंत्रण लागू करना या डेटा फ़िल्टरिंग बदलना। रनटाइम क्वेरी परिवर्तन की प्रक्रिया तीन घटकों पर आधारित होती है: tagging, meta data, और hook_query_alter()।
Drupal 7 में डेटाबेस के साथ काम — पाठ 7 — क्वेरी परिणामों की प्रोसेसिंग (fetch)
SELECT क्वेरी हमेशा 0 या उससे अधिक रिकॉर्ड्स लौटाती है। Drupal 7 में इन परिणामों को प्रोसेस (fetch) करने के कई तरीके होते हैं — आप अपनी आवश्यकता के अनुसार कोई भी तरीका चुन सकते हैं।
सबसे सामान्य तरीका है परिणामों को foreach() लूप के माध्यम से संसाधित करना:
Drupal 7 में डेटाबेस के साथ काम — पाठ 8 — डेटा जोड़ने की क्वेरीज़ (INSERT INTO)
डेटा जोड़ने (INSERT) की क्वेरीज़ हमेशा Drupal के क्वेरी बिल्डर (Query Builder) के माध्यम से बनाई जानी चाहिए। कुछ डेटाबेस सिस्टम्स में बड़े ऑब्जेक्ट्स (LOB — Large OBject, जैसे MySQL में TEXT) और बाइनरी बड़े ऑब्जेक्ट्स (BLOB — Binary Large OBject) के लिए विशेष हैंडलर की आवश्यकता होती है, इसलिए डेटाबेस ड्राइवर स्तर पर इन हैंडलरों को संभालने के लिए एक अमूर्त परत (abstraction layer) आवश्यक होती है।
INSERT क्वेरीज़ db_insert() फ़ंक्शन से शुरू होती हैं:
Drupal 7 में डेटाबेस के साथ काम — पाठ 9 — रिकॉर्ड अपडेट क्वेरीज़ (UPDATE)
रिकॉर्ड अपडेट (UPDATE) क्वेरीज़ को हमेशा Drupal के क्वेरी बिल्डर (Query Builder) के माध्यम से बनाना चाहिए। विभिन्न डेटाबेस सिस्टम्स में बड़े ऑब्जेक्ट्स (LOB — Large OBjects, जैसे MySQL में TEXT) और बाइनरी बड़े ऑब्जेक्ट्स (BLOB — Binary Large OBjects) के लिए अलग-अलग हैंडलर होते हैं। इसलिए, इन मामलों को संभालने के लिए क्वेरी एब्स्ट्रैक्शन लेयर आवश्यक होती है, जिससे हर डेटाबेस ड्राइवर अपनी विशिष्ट प्रक्रिया लागू कर सके।
अपडेट क्वेरी db_update() फ़ंक्शन से शुरू होती है: