Antes de mudar para o PDO, criei consultas SQL em PHP concatenando seqüências de caracteres. Se eu receber um erro de sintaxe do banco de dados, eu poderia apenas repetir a string de consulta SQL final, tentar por mim mesma no banco de dados e ajustá-la até corrigir o erro e depois inseri-la novamente no código.
As instruções PDO preparadas são mais rápidas, melhores e mais seguras, mas uma coisa me incomoda: nunca vejo a consulta final como ela é enviada ao banco de dados. Quando recebo erros sobre a sintaxe no meu log do Apache ou no meu arquivo de log personalizado (registro erros dentro de um catch
bloco), não consigo ver a consulta que os causou.
Existe uma maneira de capturar a consulta SQL completa enviada pelo PDO ao banco de dados e registrá-la em um arquivo?
/var/log/mysql/*
. Os parâmetros vinculados ao PDO não podem causar erros de sintaxe, portanto, tudo o que você precisa é da consulta SQL preparada.var_dump($pdo_instance->debugDumpParams())
Respostas:
Você diz o seguinte:
Bem, na verdade, ao usar instruções preparadas, não existe uma " consulta final " :
Então, para responder sua pergunta:
Não: como não há " consulta SQL completa " em nenhum lugar, não há como capturá-la.
A melhor coisa que você pode fazer, para fins de depuração, é "reconstruir" uma consulta SQL "real", injetando os valores na cadeia SQL da instrução.
O que eu costumo fazer, nesse tipo de situação, é:
var_dump
(ou equivalente) logo após, para exibir os valores dos parâmetrosIsso não é ótimo quando se trata de depuração - mas esse é o preço das instruções preparadas e as vantagens que elas trazem.
fonte
Procurando no log do banco de dados
Embora Pascal MARTIN esteja correto, o DOP não envia a consulta completa ao banco de dados de uma só vez, ryeguy a sugestão do de usar a função de log do banco de dados na verdade me permitiu ver a consulta completa montada e executada pelo banco de dados.
Veja como: (Estas instruções são para o MySQL em uma máquina Windows - sua milhagem pode variar)
my.ini
, sob a[mysqld]
seção, adicionar umlog
comando, comolog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
Esse arquivo crescerá rapidamente, exclua-o e desative o registro quando terminar de testar.
fonte
PDO::ATTR_EMULATE_PREPARES
. Veja esta resposta para mais informações: stackoverflow.com/questions/10658865/#answer-10658929general_log
vez delog
. Veja dev.mysql.com/doc/refman/5.5/en/query-log.htmlClaro que você pode depurar usando este modo
{{ PDO::ATTR_ERRMODE }}
Basta adicionar uma nova linha antes da sua consulta e mostrar as linhas de depuração.fonte
->query
ao usar instruções preparadas?Provavelmente, o que você deseja fazer é usar debugDumpParams () no identificador da instrução. Você pode executá-lo a qualquer momento após vincular valores à consulta preparada (não é necessário
execute()
da instrução).Ele não cria a instrução preparada para você, mas mostra seus parâmetros.
fonte
Um post antigo, mas talvez alguém ache isso útil;
fonte
Aqui está uma função para ver qual será o SQL efetivo, acrescido de um comentário de "Mark" em php.net :
fonte
str_replace(":$k" ....
? Os índices associativos já o possuem na matriz $ params.:name_long
por:name
. Pelo menos se:name
vier antes:name_long
. As instruções preparadas do MySQL podem lidar com isso corretamente, então não deixe que isso o confunda.Não. As consultas PDO não são preparadas no lado do cliente. O PDO simplesmente envia a consulta SQL e os parâmetros para o servidor de banco de dados. O banco de dados é o que faz a substituição (dos
?
). Você tem duas opções:fonte
quase nada foi dito sobre a exibição de erros, exceto verificar os logs de erros, mas há uma funcionalidade bastante útil:
( link de origem )
é claro que esse código pode ser modificado para ser usado como mensagem de exceção ou qualquer outro tipo de tratamento de erro
fonte
por exemplo, você tem esta instrução pdo:
agora você pode obter a consulta executada definindo uma matriz como esta:
fonte
));
deve ser);
(apenas um colchete).Pesquisando na internet, achei isso uma solução aceitável. Uma classe diferente é usada em vez das funções DOP e DOP são chamadas por meio de chamadas de funções mágicas. Não tenho certeza se isso cria sérios problemas de desempenho. Mas pode ser usado até que um recurso de registro sensível seja adicionado ao DOP.
Portanto, de acordo com esse encadeamento , você pode escrever um invólucro para a conexão PDO, que pode registrar e gerar uma exceção quando receber um erro.
Aqui está um exemplo simples:
para que você possa usar essa classe em vez de PDOStatement:
Aqui, uma implementação do decorador da DOP mencionada:
fonte
Para registrar o MySQL no WAMP , você precisará editar o my.ini (por exemplo, em wamp \ bin \ mysql \ mysql5.6.17 \ my.ini)
e adicione a
[mysqld]
:fonte
Aqui está uma função que eu fiz para retornar uma consulta SQL com parâmetros "resolvidos".
Supondo que você execute assim
Esta função NÃO adiciona aspas às consultas, mas faz o trabalho para mim.
fonte
O problema que tive com a solução para capturar isenções de DOP para fins de depuração é que ele só capturou isenções de DOP (duh), mas não encontrou erros de sintaxe que foram registrados como erros de php (não sei por que, mas " por que "é irrelevante para a solução). Todas as minhas chamadas PDO vêm de uma única classe de modelo de tabela que eu estendi para todas as minhas interações com todas as tabelas ... isso complicou quando eu estava tentando depurar código, porque o erro registrava a linha do código php onde minha chamada de execução era ligou, mas não me disse de onde a ligação estava sendo feita. Usei o seguinte código para resolver esse problema:
Portanto, o código acima captura ambas as exceções DOP e erros de sintaxe php e os trata da mesma maneira. Meu manipulador de erros é algo como isto:
Se alguém tiver idéias melhores sobre como obter informações relevantes para meu manipulador de erros do que definir o modelo de tabela como uma variável global, ficaria feliz em ouvi-lo e editar meu código.
fonte
esse código funciona muito bem para mim:
Não se esqueça de substituir $ data e $ query pelos seus nomes
fonte
eu uso essa classe para depurar o PDO (com Log4PHP )
fonte
Eu criei um projeto / repositório moderno carregado pelo Composer para exatamente isso aqui:
pdo-debug
Encontre a home do GitHub do projeto aqui , veja uma postagem no blog explicando aqui . Uma linha para adicionar ao seu compositor.json e, em seguida, você pode usá-lo assim:
$ sql é a instrução SQL bruta, $ parameters é uma matriz de seus parâmetros: A chave é o nome do espaço reservado (": user_id") ou o número do parâmetro não nomeado ("?"), o valor é .. bem, o valor.
A lógica por trás: Este script simplesmente classifica os parâmetros e os substitui na string SQL fornecida. Super simples, mas super eficaz para 99% dos seus casos de uso. Nota: Esta é apenas uma emulação básica, não uma depuração real do PDO (pois isso não é possível porque o PHP envia SQL e parâmetros brutos para o servidor MySQL separados).
Muito obrigado a bigwebguy e Mike, do thread StackOverflow. Obtendo a string de consulta SQL bruta do PDO por escrever basicamente toda a função principal por trás desse script. Engrandecer!
fonte
Como depurar consultas de banco de dados mysql PDO no Ubuntu
TL; DR Registre todas as suas consultas e siga o log do mysql.
Estas instruções são para a minha instalação do Ubuntu 14.04. Emita o comando
lsb_release -a
para obter sua versão. Sua instalação pode ser diferente.Ative o login no mysql
cd /etc/mysql
. Você deve ver um arquivo chamadomy.cnf
. Esse é o arquivo que vamos mudar.cat my.cnf | grep general_log
. Isso filtra omy.cnf
arquivo para você. Você verá duas entradas:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.Bom trabalho! Você está pronto. Agora tudo o que você precisa fazer é ajustar o arquivo de log para que você possa ver as consultas DOP que seu aplicativo faz em tempo real.
Tail o registro para ver suas consultas
Digite este cmd
tail -f /var/log/mysql/mysql.log
.Sua saída será mais ou menos assim:
Quaisquer novas consultas feitas por seu aplicativo serão exibidas automaticamente , desde que você continue seguindo o registro. Para sair da cauda, pressione
cmd/ctrl c
.Notas
truncate --size 0 mysql.log
.Crédito e agradecimento
Um enorme grito à resposta de Nathan Long acima, para que o inspo descubra isso no Ubuntu. Também para dikirill pelo seu comentário no post de Nathan que me levou a esta solução.
Te amo stackoverflow!
fonte
No ambiente Debian NGINX, fiz o seguinte.
Vá para
/etc/mysql/mysql.conf.d
editar,mysqld.cnf
se vocêlog-error = /var/log/mysql/error.log
adicionar, adicione as 2 linhas abaixo.Para ver os logs irem
/var/log/mysql
etail -f mysql.log
Lembre-se de comentar essas linhas quando terminar a depuração, se você estiver no ambiente de produção excluído,
mysql.log
pois esse arquivo de log aumentará rapidamente e poderá ser enorme.fonte