Drupal 7 में डेटाबेस के साथ काम — पाठ 3 — स्टैटिक क्वेरीज़ (SELECT)
Drupal में सबसे सामान्य क्वेरी प्रकार है स्टैटिक क्वेरी। ऐसी क्वेरी डेटाबेस को बिल्कुल उसी रूप में भेजी जाती है जैसे लिखी गई हो। केवल SELECT क्वेरीज़ ही स्टैटिक हो सकती हैं।
स्टैटिक क्वेरीज़ का उपयोग केवल बहुत सरल मामलों में करना चाहिए। यदि आपको जटिल, डायनेमिक रूप से निर्मित, या रनटाइम पर संशोधित की जाने वाली क्वेरीज़ चाहिए, तो आपको डायनेमिक क्वेरीज़ का उपयोग करना चाहिए।
स्टैटिक क्वेरी चलाने का सरल तरीका है:
<?php $result = $conn->query("SELECT nid, title FROM {node}"); ?>
हालाँकि, बेहतर तरीका है procedural wrapper db_query() का उपयोग करना:
<?php $result = db_query("SELECT nid, title FROM {node}"); ?>
db_query() का उपयोग करना इस कोड के बराबर है:
<?php $result = Database::getConnection()->query("SELECT nid, title FROM {node}"); ?>
db_query() बेहतर है क्योंकि यह क्वेरी सुरक्षा, placeholders और table prefix जैसी Drupal की सभी सुविधाओं को संभालता है।
db_query() तीन पैरामीटर स्वीकार करता है:
- SQL क्वेरी स्ट्रिंग, जिसमें placeholders का उपयोग किया जा सकता है।
- Placeholders के मानों का ऐरे।
- वैकल्पिक options ऐरे, जो यह नियंत्रित करता है कि क्वेरी कैसे चलाई जाए।
टेबल प्रीफ़िक्सिंग
स्टैटिक क्वेरी में सभी टेबल नामों को {}
ब्रेसेस में लिखना चाहिए। इससे Drupal स्वचालित रूप से साइट-विशिष्ट प्रीफ़िक्स जोड़ सकता है (जैसे “site1_”, “site2_”)। यह एक ही डेटाबेस में कई Drupal साइटों को चलाने में मदद करता है।
Placeholders (स्थान धारक)
Placeholders का उपयोग उपयोगकर्ता द्वारा प्रदत्त मानों को SQL स्ट्रिंग से अलग रखने के लिए किया जाता है, जिससे SQL injection से बचा जा सके। Placeholder के नाम कॉलन :
से शुरू होते हैं।
<?php $result = db_query("SELECT nid, title FROM {node} WHERE created > :created", array( ':created' => REQUEST_TIME - 3600, )); ?>
ऊपर का उदाहरण पिछले एक घंटे में बनाए गए सभी नोड्स को चुनता है। :created
placeholder को REQUEST_TIME - 3600
से बदला जाएगा। प्रत्येक placeholder का नाम अद्वितीय होना चाहिए।
Placeholder को क्वेरी में उद्धरण चिह्नों में नहीं डालना चाहिए — Drupal स्वयं मान के प्रकार (string या number) के अनुसार उसे सुरक्षित रूप से जोड़ता है।
<?php // गलत उदाहरण: $result = db_query("SELECT nid, title FROM {node} WHERE type = ':type'", array( ':type' => 'page', )); // सही उदाहरण: $result = db_query("SELECT nid, title FROM {node} WHERE type = :type", array( ':type' => 'page', )); ?>
ध्यान दें — placeholders केवल मानों के लिए उपयोग किए जा सकते हैं, टेबल या कॉलम नामों के लिए नहीं।
Placeholder Arrays
Drupal का डेटाबेस लेयर placeholder arrays को भी सपोर्ट करता है। यदि आप किसी placeholder को एक array के रूप में पास करते हैं, तो Drupal उसे स्वचालित रूप से कॉमा से अलग किए गए placeholders में बदल देगा।
<?php db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144))); // Drupal इसे इस प्रकार बदल देता है: db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array( ':nids_1' => 13, ':nids_2' => 42, ':nids_3' => 144, )); ?>
क्वेरी पैरामीटर्स (Query Options)
db_query() का तीसरा पैरामीटर options array होता है, जो यह तय करता है कि क्वेरी कैसे चलेगी। दो सबसे अधिक उपयोग किए जाने वाले विकल्प हैं:
- target — बताता है कि क्वेरी किस डेटाबेस सर्वर पर चलेगी (जैसे "default" या "slave")।
- fetch — यह नियंत्रित करता है कि परिणाम किस रूप में लौटेंगे।
fetch पैरामीटर के संभावित मान:
- PDO::FETCH_OBJ — परिणाम stdClass ऑब्जेक्ट्स के रूप में।
- PDO::FETCH_ASSOC — परिणाम एसोसिएटिव ऐरे के रूप में।
- PDO::FETCH_NUM — परिणाम इंडेक्स्ड ऐरे के रूप में।
- PDO::FETCH_BOTH — परिणाम दोनों इंडेक्स्ड और एसोसिएटिव ऐरे के रूप में।
अधिक जानकारी के लिए देखें: PHP PDO::fetch()
उदाहरण: क्वेरी को slave सर्वर पर चलाना और परिणाम को एसोसिएटिव ऐरे के रूप में प्राप्त करना:
<?php $result = db_query("SELECT nid, title FROM {node}", array(), array( 'target' => 'slave', 'fetch' => PDO::FETCH_ASSOC, )); ?>