Para quem adora padronização e organização, no MySQL existe o recurso chamado Prepared Statements.
Imagine a seguinte situação: você precisa criar uma procedure que faça todas as consultas em todas as entidades do seu banco e outra que apenas inserções e assim por diante… Uma para cada DML (data manipulation language) tudo passando por parametros, esse é o statement prepare.
Resumidamente você prepara a query antes de executa-lá no banco de dados, então vamos colocar a mão na massa e mostrar esse recurso.
Criando o usuário
O primeiro passo é criar um usuário no banco de dados que tenha permissão para executar rotinas. Eu que trabalho sempre com stored procedures utilizo apenas o EXECUTE, mas se você trabalha com DMLs diretas nas aplicações, pode criar diversas permissões ou um usuário com todos os privilégios (ALL PRIVILEGES).
Segue abaixo o exemplo de EXECUTE:
GRANT EXECUTE ON *.* TO layo.azevedo@localhost IDENTIFIED BY 'w9QSK4yD' WITH GRANT OPTION;
Segue abaixo o exemplo de um ALL PRIVILEGES:
GRANT ALL PRIVILEGES ON *.* TO layo.azevedo@localhost IDENTIFIED BY 'w9QSK4yD' WITH GRANT OPTION;
ESSES FORAM OS COMANDOS PARA CRIAR UM USUARIO:
GRANT – CRIA USUARIO
EXECUTE – EXECUTA APENAS ROTINAS
ALL PRIVILEGES – PERMITE EXECUTAR TUDO NO BANCO DE DADOS
*.* – O PRIVILEGIO APLICA-SE A TODAS AS BASES
IDENTIFIED BY – É A SUA SENHA
WITH GRANT OPTION – O USUARIO PODE CRIAR DIVERSOS USUARIOS E CONCEDER PRIVILEGIOS A ELE.
Sinceramente eu aconselho trabalhar com o EXECUTE. Com ele é difícil de tentarem injection sql.
Agora que criamos o usuario layo.azevedo@localhost vou criar uma procedure com a função de executar qualquer select no MySQL, começando com o delimitador do código para não parar quando o MySQL achar o sinal de ‘;’ (ponto vírgula):
DELIMITER $$ $$
Dentro do DELIMITER colocamos a procedure com o nome de SelectGeral com três parâmetros: nome da tabela, condição e valor:
1 – Chamarei tabela de p_tabela, condição de p_condicao e valor de p_valor (lembre-se que o MySQL é fortemente tipado então coloque o tipo se é VARCHAR, CHAR, INT, etc…)
DELIMITER $$ create procedure SelectGeral (p_tabela(VARCHAR(20), p_condicao(VARCHAR(10), p_valor (VARCHAR(30)) BEGIN END $$
Proximo passo é criar uma variável para executar a query dentro do banco. Nesse caso usaremos o SET juntamente com o comando CONCAT para concatenarmos os dados.
DELIMITER $$ create procedure SelectGeral (p_tabela VARCHAR(20), p_condicao VARCHAR(10), p_valor VARCHAR(30)) BEGIN SET @Variavel = CONCAT('SELECT * from ', p_tabela,' WHERE ', p_condicao , ' = ''' ,p_valor,''''); END $$
O último passo é executar a variável:
DELIMITER $$ create procedure SelectGeral (p_tabela VARCHAR(20), p_condicao VARCHAR(10), p_valor VARCHAR(30)) BEGIN SET @Variavel = CONCAT('SELECT * from ', p_tabela,' WHERE ', p_condicao , ' = ''' ,p_valor,''''); PREPARE consulta_geral FROM @Variavel ; EXECUTE consulta_geral; END $$
Pronto criamos a procedure SelectGeral com o Prepared Statements. Para visualizar basta executar o seguinte comando:
CALL SelectGeral ('usuario', 'nome', 'layo.azevedo');
Ou seja seria essa query = SELECT * from usuario WHERE nome = ‘layo.azevedo’
Esse foi um exemplo bem básico, mostrando o caminho das pedras para iniciantes que tenham alguma dúvida sobre Prepared Statements.