SelectQuery
implementa SelectQuery::__toString()
, que é chamado nos contextos em que uma sequência é necessária.
Considere o seguinte código.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Sua saída é a seguinte.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Para obter a matriz de argumentos usados para a consulta, você pode chamar SelectQuery::arguments()
.
O código a seguir imprime a consulta e seus argumentos usando as funções disponibilizadas no módulo Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
O módulo Devel não é necessário e você pode drupal_set_message()
mostrar a saída. Por exemplo, você pode usar a seguinte função para obter uma string com os espaços reservados substituídos por seus valores reais.
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;
}
O código de exemplo anterior que eu mostrei se tornaria o seguinte.
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;
}
Observe que SelectQuery::arguments()
retorna a matriz de argumentos de consulta apenas quando é chamado depois SelectQuery::__toString()
, SelectQuery::compile()
ou SelectQuery::execute()
; caso contrário, SelectQuery::arguments()
retorna NULL
.
Você pode usar uma função semelhante à seguinte para obter a consulta de string, com os espaços reservados substituídos pelos argumentos.
_get_query_string()
deveria ter sido parte daSelectQuery
interface.Você pode usar dpq () para exibir a consulta e dpr () para exibir o resultado.
fonte
try
catch
bloco quando a consulta falha. Portanto, não é útil no meu caso se eu não puder depurar a consulta quebrada.Outra opção é:
fonte
dpq
não parece permitir isso, mesmo em uma tentativa / captura.As respostas acima são boas quando você tem o Devel instalado e configurado.
A melhor maneira de imprimir a consulta sem Devel é a seguinte.
Podemos usar uma das maneiras acima para imprimir a consulta.
fonte
Eu tenho uma boa solução que você pode copiar / colar sua string de consulta diretamente na seção "SQL" no Phpmyadmin e depurar sua consulta (eu geralmente uso esse método quando luto com a consulta)
Espero que isso seja útil para outros caras.
fonte