Estamos usando o Doctrine, um ORM PHP. Estou criando uma consulta como esta:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
e então na função eu estou adicionando várias cláusulas where e coisas conforme apropriado, como este
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Mais tarde, antes de execute()
criar esse objeto de consulta, quero imprimir o SQL bruto para examiná-lo e fazer o seguinte:
$q->getSQLQuery();
No entanto, isso apenas imprime a instrução preparada, não a consulta completa. Eu quero ver o que está enviando para o MySQL, mas, em vez disso, está imprimindo uma declaração preparada, incluindo ?
's. Existe alguma maneira de ver a consulta 'completa'?
Respostas:
A doutrina não está enviando uma "consulta SQL real" ao servidor de banco de dados: na verdade, ela está usando instruções preparadas, o que significa:
$query->getSql()
)$query->getParameters()
)Isso significa que nunca há uma consulta SQL "real" no lado do PHP - portanto, o Doctrine não pode exibi-la.
fonte
$query->getParameters();
NÃO irá retornar parâmetros na ordem correta, como eles devem aparecer na declaração consulta preparadaUm exemplo de trabalho:
fonte
Você pode verificar a consulta executada pelo seu aplicativo se registrar todas as consultas no mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
haverá mais consultas, não apenas a que você está procurando, mas também poderá cumpri-la.
mas geralmente
->getSql();
funcionaEditar:
para visualizar todas as consultas mysql que eu uso
e adicione essas 2 linhas:
e reinicie o mysql
fonte
Eu criei um Doctrine2 Logger que faz exatamente isso. Ele "hidrata" a consulta sql parametrizada com os valores usando os conversores de tipo de dados do Doctrine 2.
Exemplo de uso :; A seguinte paz de código ecoará na saída padrão de qualquer sentença INSERT, UPDATE, DELETE SQL gerada com o $ em Entity Manager,
fonte
getSqlQuery()
tecnicamente mostra todo o comando SQL, mas é muito mais útil quando você também pode ver os parâmetros.Para tornar esse padrão mais reutilizável, há uma boa abordagem descrita nos comentários em Raw SQL do Doctrine Query Object .
fonte
$q
. Não parece ser a consulta nem o construtor de consultas.$q
nesse caso, é uma consulta da doutrina 1. Você pode estar usando a Doutrina 2; nesse caso, você desejará algo como$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Espero que ajude!Não há outra consulta real, é assim que as instruções preparadas funcionam. Os valores são vinculados no servidor de banco de dados, não na camada de aplicativo.
Veja minha resposta a esta pergunta: No PHP com PDO, como verificar a consulta parametrizada final do SQL?
(Repetido aqui por conveniência :)
fonte
Minha solução:
Exemplo de uso:
fonte
Você pode acessar facilmente os parâmetros SQL usando a seguinte abordagem.
Portanto, se você imprimiu o
$param_values
e$col_names
, pode obter os valores dos parâmetros passando pelos nomes de sql e das respectivas colunas.Nota: Se
$param
retornar uma matriz, você precisará repetir, pois os parâmetros internosIN (:?)
geralmente vêm como uma matriz aninhada.Enquanto isso, se você encontrar outra abordagem, tenha a gentileza de compartilhar conosco :)
Obrigado!
fonte
Solução mais clara:
fonte
fonte
Você pode usar :
Se você estiver usando o MySQL, poderá usar o Workbench para visualizar instruções SQL em execução. Você também pode usar a visualização da consulta em execução no mysql usando o seguinte:
fonte
Talvez possa ser útil para alguém:
fonte
TL; DR
nos arquivos de galho, use os filtros auxiliares de galho do Doctrine:
Explicação:
As outras respostas mencionando que a declaração preparada são realmente "consultas reais" estão corretas, mas elas não respondem à expectativa óbvia do solicitante ... Todo desenvolvedor deseja exibir uma "consulta executável" para depuração (ou exibi-la ao usuário) .
Então, procurei na fonte do Symfony Profiler para ver como eles fazem isso. A parte Doutrina é responsabilidade da Doutrina, de modo que eles criaram um pacote de doutrinas para integrar com o Symfony. Examinando o
doctrine-bundle/Resources/views/Collector/db.html.twig
arquivo, você descobrirá como eles o fazem (isso pode mudar entre as versões). Curiosamente, eles criaram filtros de galhos que podemos reutilizar (veja acima).Para que tudo funcione, precisamos ativar o Log para nossa consulta. Existem várias maneiras de fazer isso e aqui eu uso o DebugStack, que permite registrar consultas sem realmente imprimi-las. Isso também garante que isso funcione no modo de produção, se é isso que você precisa ...
Se você precisar de mais formatação, verá que eles incluem algum CSS em uma tag de estilo, então simplesmente "roube" ^ ^:
Espero que isso ajude ;-)
fonte
Eu escrevi um logger simples, que pode registrar a consulta com os parâmetros inseridos. Instalação:
Uso:
fonte
fonte
A função @dsamblas modificada para funcionar quando parâmetros são strings de data como este '2019-01-01' e quando há uma matriz passada usando IN como
. Faça tudo o que dsamblas escreveu, mas substitua startQuery por este ou veja as diferenças e adicione meu código. (caso ele tenha modificado algo em sua função e minha versão não tenha modificações).
Não testou muito.
fonte
Eu fiz algumas pesquisas para este tópico, porque eu queria depurar uma consulta SQL gerada e executá-la no editor sql. Como visto em todas as respostas, é um tópico altamente técnico.
Quando eu assumo que a pergunta inicial é baseada no dev-env, uma resposta muito simples está faltando no momento. Você pode simplesmente usar a compilação no Symfony Profiler. Basta clicar na guia Doutrina, vá até a consulta que deseja inspecionar. Em seguida, clique em "visualizar consulta executável" e você pode colar sua consulta diretamente no seu editor SQL
Abordagem mais básica da interface do usuário, mas muito rápida e sem sobrecarga de código de depuração.
fonte
fonte
Para imprimir uma consulta SQL no Doctrine, use:
fonte