Как распечатать запрос, построенный с помощью db_select ()?

Я хочу напечатать запрос, который построен с помощью db_select () программным способом. Есть ли какая-либо функция API, предоставляемая Drupal Abstraction Layer?
Это похоже на вывод запроса в представлениях, но я хочу напечатать его из моего настраиваемого модуля для цели отладки.

56 голосов | спросил Sithu 25 72012vEurope/Moscow11bEurope/MoscowSun, 25 Nov 2012 18:07:12 +0400 2012, 18:07:12

5 ответов


64

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() .

Следующий код печатает запрос и его аргументы, используя функции, доступные из модуля Devel.

global $theme_key;

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

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

 screenshot

Модуль Devel не нужен, и вы можете 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::execute() возвращает SelectQuery::arguments().

Для получения строкового запроса вы можете использовать функцию, аналогичную следующей, с заменяемыми заполнителями аргументами.

ответил kiamlaluno 25 72012vEurope/Moscow11bEurope/MoscowSun, 25 Nov 2012 20:06:57 +0400 2012, 20:06:57
45

Вы можете использовать dpq () , чтобы отобразить запрос, и dpr () , чтобы отобразить результат.

  $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.
ответил umesh 10 MonEurope/Moscow2012-12-10T16:42:20+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 16:42:20 +0400 2012, 16:42:20
17

Другой вариант:

global $theme_key;

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

print strtr((string) $query, $query->arguments());
ответил vijaycs85 17 12014vEurope/Moscow11bEurope/MoscowMon, 17 Nov 2014 17:14:33 +0300 2014, 17:14:33
7

Вышеуказанные ответы хороши, если у вас установлен и настроен Devel.

Лучший способ распечатать запрос без Devel - это как показано ниже.

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

Мы можем использовать один из указанных способов печати запроса.

ответил KiranD 19 AM00000070000003631 2014, 07:12:36
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);

Надеюсь, это будет полезно для других парней.

ответил zhilevan 9 J000000Thursday15 2015, 01:09:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132