considere Declarações preparadas usado com
concat()
como costumam ser. DROP PROCEDURE if exists myStoredProc101;
DELIMITER $$
CREATE PROCEDURE myStoredProc101
( pSanitized VARCHAR(124)
)
BEGIN
set @mySql:=concat("SELECT DISTINCT ID FROM user where match(name) against ('* *",pSanitized,"* *')");
PREPARE stmt1 FROM @mySql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
$$
DELIMITER ;
Seu proc armazenado não teve chance de funcionar, pois nem estava usando seu parâmetro. O que você fez foi enterrar algo dentro de uma string literal. Além disso, varchar(124) é um pouco estranho :p
Sobre o único sucesso que as pessoas têm com declarações preparadas é usando uma variável de usuário (com um
@
) versus tentativas malsucedidas de usar variáveis locais (de DECLARE). Então, isso pode poupar algumas horas de bater cabeça no futuro. Da página de manual do PHP Procedimentos armazenados :
Quanto a chamar o proc armazenado de
mysqli
, dê uma olhada na Resposta
de Pablo Tobar. Não parece especialmente agradável com muitas variáveis, mas parece ser onde está. Alerta de spoiler:use variáveis mysql, não variáveis PHP. É verdade que Pablo não estava retornando um conjunto de resultados, mas sim gravando em um
OUT
var no proc armazenado. Talvez você precise fazer o que ele fez para o IN
parâmetros e chame multi_query()
, então um store_result()
, então um fetch_all()
(em resumo, o PHP referencia uma página acima). Como alternativa, uma chamada seria feita pela Palladium aqui .
Em ambos os casos, o caso deve ser considerado para evitar a vulnerabilidade conhecida de passar SQL Injection para rotinas de procedimento armazenado.