Eu sei que o PDO não oferece suporte a várias consultas sendo executadas em uma instrução. Estive no Google e encontrei alguns posts falando sobre PDO_MYSQL e PDO_MYSQLND.
PDO_MySQL é um aplicativo mais perigoso do que qualquer outro aplicativo MySQL tradicional. O MySQL tradicional permite apenas uma única consulta SQL. No PDO_MySQL não existe essa limitação, mas você corre o risco de ser injetado com várias consultas.
De: Proteção contra injeção de SQL usando PDO e Zend Framework (junho de 2010; por Julian)
Parece que PDO_MYSQL e PDO_MYSQLND fornecem suporte para várias consultas, mas não consigo encontrar mais informações sobre eles. Esses projetos foram interrompidos? Existe alguma maneira agora de executar várias consultas usando PDO.
Respostas:
Como eu sei,
PDO_MYSQLND
substituídoPDO_MYSQL
no PHP 5.3. A parte confusa é que o nome ainda estáPDO_MYSQL
. Portanto, agora ND é o driver padrão para MySQL + PDO.No geral, para executar várias consultas de uma vez, você precisa:
PDO::ATTR_EMULATE_PREPARES
está definido como1
(padrão). Alternativamente, você pode evitar o uso de instruções preparadas e usá-$pdo->exec
las diretamente.Usando exec
Usando declarações
Uma nota:
Ao usar instruções preparadas emuladas, certifique-se de definir a codificação adequada (que reflete a codificação real dos dados) no DSN (disponível desde 5.3.6). Caso contrário , pode haver uma pequena possibilidade de injeção de SQL se alguma codificação estranha for usada .
fonte
Depois de meio dia mexendo nisso, descobri que o PDO tinha um bug onde ...
-
-
-
Ele executaria o
"valid-stmt1;"
, pararia"non-sense;"
e nunca geraria um erro. Não vai correr o"valid-stmt3;"
, volta verdadeiro e minta que tudo correu bem.Eu esperaria um erro no,
"non-sense;"
mas não acontece.Aqui é onde encontrei esta informação: Consulta PDO inválida não retorna um erro
Aqui está o bug: https://bugs.php.net/bug.php?id=61613
Tentei fazer isso com o mysqli e não encontrei nenhuma resposta sólida sobre como funciona, então pensei em deixar aqui para quem quiser usar.
fonte
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
sem os dois executivos anteriores? Posso fazer com que ele lance erros no meio, mas não quando executado após execs bem-sucedidos .$pdo->exec("")
são independentes um do outro. Agora, divido-os para indicar que não precisam estar em uma sequência para que o problema surja. Essas 3 são 3 configurações de execução de várias consultas em uma instrução exec.exec
na página, mas se eu executar váriosexec
cada um com várias instruções SQL neles, reproduzo o mesmo bug aqui. Mas se for o únicoexec
na página, não posso reproduzi-lo.exec
em sua página tinha várias declarações?Uma abordagem rápida e suja:
Divide em pontos finais de instrução SQL razoáveis. Não há verificação de erros, nem proteção contra injeção. Entenda seu uso antes de usá-lo. Pessoalmente, eu o uso para semear arquivos de migração brutos para testes de integração.
fonte
;
quebras se seu SQL contiver procedimentos ou definições de gatilho ... Muitos razões pelas quais não é bom.Como milhares de pessoas, estou procurando esta pergunta:
Posso executar várias consultas simultaneamente, e se houvesse um erro, nenhuma seria executada Eu fui a esta página em todos os lugares.
Mas embora os amigos aqui tenham dado boas respostas, essas respostas não eram boas para meu problema
Então eu escrevi uma função que funciona bem e quase não tem problemas com injeção de sql.
Pode ser útil para aqueles que procuram perguntas semelhantes, então eu as coloco aqui para usar
para uso (exemplo):
e minha conexão:
Nota:
Esta solução ajuda você a executar várias instruções juntas.
Se ocorrer uma instrução incorreta, ela não executará nenhuma outra instrução
fonte
Tentei seguir o código
Então
E pegou
Se adicionado
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
depois$db = ...
Então tenho a página em branco
Se em vez disso
SELECT
tentasseDELETE
, em ambos os casos ocorria um erro comoPortanto, minha conclusão de que nenhuma injeção é possível ...
fonte
but you risk to be injected with multiple queries.
Minha resposta é sobre injeçãoExperimente esta função: consultas múltiplas e inserção de valores múltiplos.
fonte
O PDO apoia isso (a partir de 2020). Basta fazer uma chamada query () em um objeto PDO como de costume, separando as consultas por; e, em seguida, nextRowset () para passar para o próximo resultado de SELECT, se houver vários. Os conjuntos de resultados estarão na mesma ordem das consultas. Obviamente, pense nas implicações de segurança - portanto, não aceite consultas fornecidas pelo usuário, use parâmetros, etc. Eu uso isso com consultas geradas por código, por exemplo.
fonte