Tableless

Busca Menu

Prepared Statements no MySQL

Seja o primeiro a comentar por

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.

Publicado no dia