Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

usando STORED PROCEDURES:resultados diferentes em mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)


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.