Drupal: возвращает строку SQL из db_query - PullRequest
3 голосов
/ 29 июня 2010

Можно ли вернуть фактический запрос SQL в виде строки из результата db_query?

Или иначе взять возвращенный идентификатор ресурса из db_query и получить строку SQL?


Edit:

В качестве дополнения я недавно узнал о db_queryd() из модуля Devel, который отражает выполненный запрос (а также выполняет его). Не возвращает строку, как задан этот вопрос, но действительно полезна для копирования и вставки полного запроса.

Ответы [ 7 ]

3 голосов
/ 29 июня 2010

Не думаю, что это так. Однако, если вы делаете это только с целью отладки, вы можете включить модуль devel, и он покажет, что запросы выполняются.

На самом деле вы можете просто установить переменную dev_query в 1, а затем получить доступ к глобальному массиву $ query, но я бы не рекомендовал это делать.

2 голосов
/ 15 ноября 2013

Если у вас D7, но у вас нет Devel, следующий фрагмент может оказаться полезным & mdash; однако он может обрабатывать не все типы заполнителей ... в настоящее время он ошибочно полагает, что все заполнители являются строками (что подходит для моего использования) .

function stringify_query( $query ){
  $s = preg_replace('/\}|\{/', '', $query->__toString());
  $a = $query->arguments();
  foreach ( $a as $key => $val ) {
    $a[$key] = '\'' . $val . '\'';
  }
  return strtr($s, $a);
}

Он также грубо удаляет фигурные скобки Drupal, используемые для обработки префиксов таблиц. Если вы полагаетесь на префиксы таблиц, то вы должны найти правильную функцию Drupal для их правильной замены.

2 голосов
/ 11 октября 2012

Drupal 7, если отладка, вы можете найти в \ includes \ database \ database.inc:

function query($query, array $args = array(), $options = array())

$ stmt's queryString

или

print_r($stmt->getQueryString());
1 голос
/ 07 января 2011

Поздний ответ, но вы часто можете быстро

$result = db_query($query, $arg1, $arg2);

превратить в

drupal_set_message(sprintf($query, $arg1, $arg2), "status");

И получить то, что вы хотите.

Это не поможет, есливы используете массив в качестве аргумента db_query, поскольку sprintf не поддерживает это, но часто используется в вашем наборе средств отладки.

1 голос
/ 29 июня 2010

Я бы порекомендовал использовать модуль devel . Существует параметр devel offer, который будет показывать все запросы, запущенные во время генерации страницы в нижней части страницы, с данными о времени выполнения запроса и функцией, которая вызвала db_query (). Если у вас есть общее представление о том, как будет выглядеть ваш запрос или функция, вызвавшая его, вы можете найти его в своем браузере и увидеть, что фактически было отправлено в базу данных.

0 голосов
/ 11 января 2015

D7 версия с devel.

> = PHP 5.4

dpm(str_replace(['{', '}'], '', dpq($query, TRUE)));

dpm(str_replace(array('{', '}'), '', dpq($query, TRUE)));
0 голосов
/ 08 августа 2013

Для тех, кто использует Drupal 7.x и модуль Devel , правильная функция для вызова для вывода встроенного оператора SQL в область сообщений drupal - dpq (). Это должно быть передано объект запроса, хотя. например,

// to see the built SQL
$query = db_select('node', 'n')->fields('n');    
dpq($query);

// to see the results of the query
$results = $query->execute()->fetchAssoc();
dsm($results);

Надеюсь, что может помочь!

...