स्टैटिक क्वेरीज़
Drupal में सबसे सामान्य SELECT क्वेरीज़ – यह स्टैटिक क्वेरीज़ होती हैं, जो डेटाबेस कनेक्शन ऑब्जेक्ट के query() मेथड का उपयोग करके बनाई जाती हैं।
स्टैटिक क्वेरीज़ लगभग ज्यों की त्यों डेटाबेस में भेजी जाती हैं।
उदाहरण:
$database = \Drupal::database();
$query = $database->query("SELECT id, example FROM {mytable}");
$result = $query->fetchAll();
केवल बहुत सरल SELECT क्वेरीज़ को ही static query() मेथड से उपयोग करना चाहिए। यदि आपको अधिक जटिल क्वेरीज़, क्वेरीज़ की डायनामिक जेनरेशन या परिवर्तनीयता की आवश्यकता है तो आपको डायनामिक क्वेरी का उपयोग करना चाहिए।
इस फ़ंक्शन का उपयोग INSERT, UPDATE या DELETE जैसी साधारण क्वेरीज़ के लिए न करें। इन्हें क्रमशः insert(), update() और delete() के माध्यम से संभाला जाना चाहिए। कई टेबल्स पर अधिक जटिल DELETE क्वेरीज़ के लिए देखें जटिल DELETE क्वेरीज़।
आर्ग्युमेंट्स
डेटाबेस कनेक्शन ऑब्जेक्ट का query() मेथड तीन आर्ग्युमेंट स्वीकार करता है:
- $query: चलाने वाली क्वेरी। आवश्यकता होने पर प्लेसहोल्डर्स का उपयोग करें और सभी टेबल नामों को कर्ली ब्रैकेट्स में लिखें।
- $args: प्लेसहोल्डर मानों की ऐरे जिसे क्वेरी में रिप्लेस किया जाएगा।
- $options: क्वेरी के व्यवहार को नियंत्रित करने के लिए विकल्पों की ऐरे (वैकल्पिक)।
टेबल नाम का प्रीफ़िक्स
स्टैटिक क्वेरीज़ में सभी टेबल नामों को कर्ली ब्रैकेट्स {...} में होना चाहिए।
टेबल नामों को कर्ली ब्रैकेट्स में रखने से डेटाबेस सिस्टम को आवश्यकता होने पर उनके साथ प्रीफ़िक्स जोड़ने की सुविधा मिलती है। प्रीफ़िक्स आपको एक ही डेटाबेस से कई साइट्स चलाने या कुछ मामलों में टेबल्स को साइट्स के बीच साझा करने की अनुमति देता है। यह सुनिश्चित करता है कि टेस्टिंग में होस्ट-साइट से डेटा लीक न हो।
प्लेसहोल्डर्स
प्लेसहोल्डर्स दर्शाते हैं कि क्वेरी में मान कहाँ डाला जाएगा। इन्हें क्वेरी से अलग रखने पर डेटाबेस SQL सिंटैक्स और यूज़र द्वारा प्रदान किए गए मानों के बीच अंतर कर सकता है, जिससे SQL इंजेक्शन अटैक से बचाव होता है।
$query = $database->query("SELECT id, example FROM {mytable} WHERE created > :created", [
':created' => REQUEST_TIME - 3600,
]);
ऊपर दिया कोड पिछले एक घंटे (3600 सेकंड) में बनाए गए सभी mytable रिकॉर्ड्स का चयन करेगा। प्लेसहोल्डर :created को रनटाइम पर REQUEST_TIME - 3600 से रिप्लेस किया जाएगा।
क्वेरी में किसी भी संख्या में प्लेसहोल्डर्स हो सकते हैं, लेकिन सभी का नाम यूनिक होना चाहिए, भले ही उनका मान समान हो। प्लेसहोल्डर्स की ऐरे इनलाइन दी जा सकती है (जैसा ऊपर है) या पहले बनाई जाकर पास की जा सकती है। ऐरे का क्रम मायने नहीं रखता।
"db_" से शुरू होने वाले प्लेसहोल्डर्स सिस्टम के आंतरिक उपयोग के लिए आरक्षित हैं और इन्हें कभी स्पष्ट रूप से उपयोग नहीं करना चाहिए।
ध्यान दें: प्लेसहोल्डर्स को उनके प्रकार की परवाह किए बिना कभी भी एस्केप या कोट्स में नहीं लिखना चाहिए। चूँकि वे डेटाबेस सर्वर पर अलग से पास होते हैं, इसलिए सर्वर खुद क्वेरी स्ट्रिंग और मान में अंतर करता है।
// गलत (':type' प्लेसहोल्डर को कोट्स में डाला गया है)
$result = $database->query("SELECT example FROM {mytable} WHERE type = ':type'", [
':type' => 'mytype',
]);
// सही (':type' प्लेसहोल्डर के चारों ओर कोट्स नहीं हैं)
$result = $database->query("SELECT example FROM {mytable} WHERE type = :type", [
':type' => 'mytype',
]);
प्लेसहोल्डर्स का उपयोग कॉलम और टेबल नामों के लिए नहीं किया जा सकता। यदि वे असुरक्षित इनपुट से आते हैं, तो उन्हें $database->escapeTable() के माध्यम से सुरक्षित करना चाहिए।
प्लेसहोल्डर-ऐरेज़
Drupal का डेटाबेस लेयर प्लेसहोल्डर्स के लिए अतिरिक्त फ़ीचर प्रदान करता है। यदि प्लेसहोल्डर का मान ऐरे है, तो इसे अपने आप कॉमा-सेपरेटेड लिस्ट में बदल दिया जाएगा। इसका मतलब है कि डेवलपर्स को प्लेसहोल्डर्स की संख्या गिनने की आवश्यकता नहीं है।
उदाहरण:
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids[])", [':ids[]' => [13, 42, 144]]);
निम्न दो स्टेटमेंट्स ऊपर दिए गए के बराबर हैं:
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids_1, :ids_2, :ids_3)", [
':ids_1' => 13,
':ids_2' => 42,
':ids_3' => 144,
]);
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (13, 42, 144)");
क्वेरी विकल्प
डेटाबेस कनेक्शन ऑब्जेक्ट के query() मेथड का तीसरा पैरामीटर एक विकल्प ऐरे है जो क्वेरी के व्यवहार को नियंत्रित करता है। आमतौर पर केवल दो निर्देश सामान्य क्वेरीज़ में उपयोग किए जाते हैं। अन्य मान मुख्य रूप से आंतरिक उपयोग के लिए होते हैं।
target कुंजी यह निर्धारित करती है कि क्वेरी कहाँ चलनी चाहिए। यदि निर्दिष्ट नहीं किया गया तो डिफ़ॉल्ट "default" होता है। वर्तमान में अन्य मान "replica" है, जिससे क्वेरी रेप्लिका सर्वर पर चलेगी यदि वह उपलब्ध है।
fetch कुंजी यह निर्धारित करती है कि क्वेरी से लौटाए गए रिकॉर्ड्स को कैसे प्राप्त किया जाएगा। मान हो सकते हैं: PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH या किसी क्लास का नाम। यदि स्ट्रिंग (क्लास का नाम) दी जाती है, तो प्रत्येक रिकॉर्ड उस क्लास का नया ऑब्जेक्ट होगा। अन्य मान PDO द्वारा निर्धारित किए जाते हैं। डिफ़ॉल्ट PDO::FETCH_OBJ है।
उदाहरण:
$result = $database->query("SELECT id, example FROM {mytable}", [], [
'target' => 'replica',
'fetch' => PDO::FETCH_ASSOC,
]);
query() द्वारा लौटाया गया रिजल्ट ऑब्जेक्ट क्वेरी की हर लाइन और कॉलम प्राप्त करने के लिए उपयोग किया जा सकता है।
$sql = "SELECT name, quantity FROM goods WHERE vid = :vid";
$result = $database->query($sql, [':vid' => $vid]);
if ($result) {
while ($row = $result->fetchAssoc()) {
// यहाँ उपयोग करें:
// $row['name']
// $row['quantity']
}
}
जटिल DELETE क्वेरीज़
स्टैटिक क्वेरी का उपयोग करना – यह मल्टी-टेबल DELETE क्वेरी को व्यक्त करने का सरल और कॉम्पैक्ट तरीका है।
उदाहरण:
$database = \Drupal::database();
$database->query("DELETE {table1}, {table2} FROM {table1} INNER JOIN {table2} ON {table1}.id = {table2}.id WHERE {table1}.id=:recno", [":recno" => 2]);
(यह table1 और table2 दोनों से रिकॉर्ड हटाता है)