वह क्वेरी प्रिंट करें जो db_select () का उपयोग करके बनाई गई है


61

मैं एक प्रोग्रामेटिक तरीके से db_select () का उपयोग करके बनाई गई क्वेरी को प्रिंट करना चाहता हूं । क्या Drupal Abstraction Layer द्वारा कोई API फ़ंक्शन प्रदान किया गया है?
यह दृश्य में क्वेरी आउटपुट के समान है, लेकिन मैं इसे डीबगिंग उद्देश्य के लिए अपने कस्टम मॉड्यूल से प्रिंट करना चाहता हूं।

जवाबों:


67

SelectQueryऔजार SelectQuery::__toString(), जिसे संदर्भों में कहा जाता है जहां एक स्ट्रिंग की आवश्यकता होती है।

निम्नलिखित कोड पर विचार करें।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print $query;

इसका आउटपुट निम्नलिखित है।

SELECT block.*
FROM 
{block} block
WHERE  (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)

क्वेरी के लिए उपयोग किए गए तर्कों का सरणी प्राप्त करने के लिए, आप कॉल कर सकते हैं SelectQuery::arguments()

निम्नलिखित कोड डीवेल मॉड्यूल से उपलब्ध कार्यों का उपयोग करके क्वेरी और उसके तर्कों को प्रिंट करता है।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

dpm((string) $query);
dpm($query->arguments());

स्क्रीनशॉट

हालांकि, देवल मॉड्यूल आवश्यक नहीं है, और आप drupal_set_message()आउटपुट दिखा सकते हैं । उदाहरण के लिए, आप अपने वास्तविक मूल्यों द्वारा प्रतिस्थापित प्लेसहोल्डर्स के साथ एक स्ट्रिंग प्राप्त करने के लिए निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं।

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

पिछला उदाहरण कोड जो मैंने दिखाया वह निम्नलिखित होगा।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

drupal_set_message(format_string('Query: %query', array('%query' => _get_query_string($query))));

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

सूचना है कि SelectQuery::arguments()क्वेरी तर्कों की सरणी देता है केवल जब यह कहा जाता है के बाद SelectQuery::__toString(), SelectQuery::compile()या SelectQuery::execute(); अन्यथा, SelectQuery::arguments()रिटर्न NULL

आप स्ट्रिंग क्वेरी प्राप्त करने के लिए निम्न के समान फ़ंक्शन का उपयोग कर सकते हैं, तर्क के साथ प्लेसहोल्डर्स के साथ।


1
मुझे लगता है कि एक फ़ंक्शन _get_query_string()को SelectQueryइंटरफ़ेस का हिस्सा होना चाहिए था ।
डैशोहोक्सा

46

आप उपयोग कर सकते हैं dpq () क्वेरी, और प्रदर्शित करने के लिए डीपीआर () परिणाम प्रदर्शित करने के लिए।

  $query = db_select('users','u');
  $query->fields('u');
  $query->condition('u.uid', 1042);
  $result = $query->execute()->fetchAll();

  dpq($query); // Display the query. 
  dpr($result); // Display the query result.

1
ध्यान दें कि इसके लिए डेवेल मॉड्यूल को स्थापित करना आवश्यक है। यदि आप Devel (I love it) का उपयोग करते हैं, तो यह जाने का सबसे आसान तरीका है।
joe_flash

2
dpq () तुम कहाँ हो मेरी सारी ज़िन्दगी!
लोमैक्स

try catchक्वेरी के विफल होने पर ब्लॉक में काम नहीं करता है। अगर मैं टूटी हुई क्वेरी को डीबग नहीं कर सकता, तो मेरे मामले में सहायक नहीं है।
कीजे

19

एक अन्य विकल्प है:

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print strtr((string) $query, $query->arguments());

2
लघु और संक्षिप्त वास्तव में।
१०:

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

1
यह सही उत्तर होना चाहिए।
अलबर्ट्स्की

8

उपरोक्त उत्तर अच्छे हैं जब आपने डेवेल स्थापित और कॉन्फ़िगर किया है।

डेवेल के बिना क्वेरी को प्रिंट करने का सबसे अच्छा तरीका नीचे दिया गया है।

$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
//One way
echo $query->__toString();
// Second way
echo (string)$query;

हम क्वेरी को प्रिंट करने के लिए उपरोक्त तरीकों में से एक का उपयोग कर सकते हैं।


4

मेरे पास एक अच्छा उपाय है कि आप अपनी क्वेरी स्ट्रिंग को सीधे "SQL" अनुभाग में Phpmyadmin में कॉपी / पेस्ट कर सकते हैं और अपनी क्वेरी को डिबग कर सकते हैं (जब मैं क्वेरी से जूझता हूं तो मैं अक्सर इस पद्धति का उपयोग करता हूं)

$querystring=$query->__toString();
$querystring=str_replace("{",'',$querystring);
$querystring=str_replace("}",'',$querystring);
foreach($query->getArguments() as $key=> $item){

    if(!$item) {
        $item = 'NULL';
    }
    $querystring=str_replace($key.')',$item.')',$querystring);
}
dpm($querystring);

मुझे उम्मीद है कि यह अन्य लोगों के लिए उपयोगी होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.