Как распечатать запрос, построенный с помощью db_select ()?
Я хочу напечатать запрос, который построен с помощью db_select () программным способом. Есть ли какая-либо функция API, предоставляемая Drupal Abstraction Layer?
Это похоже на вывод запроса в представлениях, но я хочу напечатать его из моего настраиваемого модуля для цели отладки.
5 ответов
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());
Модуль 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()
.
Для получения строкового запроса вы можете использовать функцию, аналогичную следующей, с заменяемыми заполнителями аргументами.
Вы можете использовать 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.
Другой вариант:
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print strtr((string) $query, $query->arguments());
Вышеуказанные ответы хороши, если у вас установлен и настроен 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;
Мы можем использовать один из указанных способов печати запроса.
У меня есть хорошее решение, которое вы можете скопировать /вставить строку запроса непосредственно в разделе «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);
Надеюсь, это будет полезно для других парней.