SelectQuery
implementuje SelectQuery::__toString()
, który jest wywoływany w kontekstach, w których wymagany jest ciąg.
Rozważ następujący kod.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Jego wynik jest następujący.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Aby uzyskać tablicę argumentów używanych dla zapytania, możesz wywołać SelectQuery::arguments()
.
Poniższy kod drukuje zapytanie i jego argumenty za pomocą funkcji udostępnionych z modułu Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
Moduł Devel nie jest jednak konieczny i można drupal_set_message()
wyświetlić wynik. Na przykład można użyć następującej funkcji, aby uzyskać ciąg znaków z symbolami zastępczymi zastąpionymi przez ich rzeczywiste wartości.
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;
}
Poprzedni przykładowy kod, który pokazałem, stałby się następującym.
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;
}
Zauważ, że SelectQuery::arguments()
zwraca tablicę argumentów zapytań tylko wtedy, gdy jest ona wywoływana po SelectQuery::__toString()
, SelectQuery::compile()
lub SelectQuery::execute()
; w przeciwnym razie SelectQuery::arguments()
zwraca NULL
.
Możesz użyć funkcji podobnej do poniższej, aby uzyskać zapytanie łańcuchowe, z symbolami zastępczymi zastąpionymi argumentami.
_get_query_string()
powinna być częściąSelectQuery
interfejsu.Możesz użyć dpq (), aby wyświetlić zapytanie, i dpr (), aby wyświetlić wynik.
źródło
try
catch
bloku, gdy zapytanie nie powiedzie się. W moim przypadku nie jest to pomocne, jeśli nie mogę debugować uszkodzonego zapytania.Inną opcją jest:
źródło
dpq
spowoduje błąd, wydaje się , że nie pozwala na to nawet podczas try / catch.Powyższe odpowiedzi są dobre, jeśli masz zainstalowany i skonfigurowany program Devel.
Najlepszym sposobem wydrukowania zapytania bez Devel jest jak poniżej.
Możemy użyć jednego z powyższych sposobów wydrukowania zapytania.
źródło
Mam dobre rozwiązanie, które możesz skopiować / wkleić ciąg zapytania bezpośrednio w sekcji „SQL” w Phpmyadmin i debugować zapytanie (często używam tej metody, gdy mam problem z zapytaniem)
Mam nadzieję, że będzie to przydatne dla innych facetów.
źródło