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::arguments()
возвращается NULL
.
Вы можете использовать функцию, подобную следующей, чтобы получить строковый запрос, с заполнителями, замененными аргументами.
_get_query_string()
должна была быть частьюSelectQuery
интерфейса.Вы можете использовать dpq () для отображения запроса и dpr () для отображения результата.
источник
try
catch
блоке при сбое запроса. Поэтому в моем случае бесполезно, если я не могу отладить неработающий запрос.Другой вариант:
источник
dpq
кажется, не позволяет этого даже при попытке / перехвате.Приведенные выше ответы хороши, если у вас установлен и настроен Devel.
Лучший способ напечатать запрос без Devel, как показано ниже.
Мы можем использовать один из вышеперечисленных способов для печати запроса.
источник
У меня есть хорошее решение, что вы можете скопировать / вставить строку запроса непосредственно в разделе «SQL» в Phpmyadmin и отладить ваш запрос (я часто использую этот метод, когда я борюсь с запросом)
Я надеюсь, что это будет полезно для других парней.
источник