query
executa uma instrução SQL padrão e requer que você escape adequadamente de todos os dados para evitar injeções de SQL e outros problemas.
execute
executa uma instrução preparada que permite vincular parâmetros para evitar a necessidade de escapar ou citar os parâmetros. execute
também terá um desempenho melhor se você estiver repetindo uma consulta várias vezes. Exemplo de declarações preparadas:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories);
$sth->bindParam(':colour', $colour);
$sth->execute();
// $calories or $color do not need to be escaped or quoted since the
// data is separated from the query
A melhor prática é seguir instruções preparadas e execute
aumentar a segurança .
Consulte também: As instruções preparadas para DOP são suficientes para impedir a injeção de SQL?
: calories
é o equivalentemysql_real_escape_string()
a interromper as injeções ou precisa mais do que apenas$sth->bindParam(':calories', $calories);
para aumentar a segurança?query
retornar uma declaração PDOS , em vez de um bool comoexecute
?Não, eles não são os mesmos. Além do escape no lado do cliente que ele fornece, uma instrução preparada é compilada no lado do servidor uma vez e, em seguida, podem ser transmitidos parâmetros diferentes a cada execução. O que significa que você pode fazer:
Eles geralmente proporcionam uma melhora no desempenho, embora não sejam perceptíveis em pequena escala. Leia mais sobre instruções preparadas (versão MySQL) .
fonte
A resposta de Gilean é ótima, mas eu só queria acrescentar que, às vezes, existem raras exceções às melhores práticas, e você pode testar seu ambiente nos dois sentidos para ver o que funcionará melhor.
Em um caso, descobri que
query
funcionava mais rápido para meus objetivos porque estava transferindo dados confiáveis em massa de uma caixa Ubuntu Linux executando PHP7 com o driver Microsoft ODBC da Microsoft com suporte insuficiente para o MS SQL Server .Cheguei a essa pergunta porque tinha um script de longa duração para um ETL que estava tentando pressionar pela velocidade. Pareceu-me intuitivo que
query
poderia ser mais rápido do queprepare
&execute
porque estava chamando apenas uma função em vez de duas. A operação de ligação de parâmetro fornece excelente proteção, mas pode ser cara e possivelmente evitada se desnecessária.Dadas algumas condições raras :
Se você não conseguir reutilizar uma instrução preparada porque ela não é suportada pelo driver ODBC da Microsoft .
Se você não estiver preocupado com a higienização das entradas e com a simples fuga, é aceitável. Pode ser esse o caso, porque a vinculação de certos tipos de dados não é suportada pelo driver ODBC da Microsoft .
PDO::lastInsertId
não é suportado pelo driver ODBC da Microsoft.Aqui está um método que eu usei para testar meu ambiente e espero que você possa replicá-lo ou algo melhor no seu:
Para começar, eu criei uma tabela básica no Microsoft SQL Server
E agora um teste cronometrado básico para métricas de desempenho.
Eu joguei com o julgamento diferente múltipla e conta no meu ambiente específico, e consistentemente ficar entre 20-30% mais rápido resultados com
query
queprepare
/execute
Estou curioso para ver como esse teste se compara em outros ambientes, como o MySQL.
fonte