sql >> Base de Datos >  >> RDS >> Mysql

usando PROCEDIMIENTOS ALMACENADOS:diferentes resultados en mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

considere Declaraciones preparadas usado con concat() como suelen 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 ;

Su proceso almacenado no tenía ninguna posibilidad de funcionar ya que ni siquiera estaba usando su parámetro. Lo que hiciste fue enterrar algo dentro de una cadena literal. Además, varchar(124) es un poco raro :p

Casi el único éxito que la gente tiene con declaraciones preparadas es con el uso de una variable de usuario (con un @ ) versus intentos fallidos de usar Variables Locales (de DECLARE). Entonces, eso puede ahorrarle algunas horas de golpes en la cabeza en el futuro.

Desde la página del manual de PHP Procedimientos almacenados :

En cuanto a llamar al proceso almacenado desde mysqli , eche un vistazo a la Respuesta de Pablo Tobar. No se ve especialmente agradable con muchas variables, pero parece que ahí está. Alerta de spoiler:use variables mysql, no variables PHP.

De acuerdo, Pablo no devolvía un conjunto de resultados, sino que escribía en un OUT var en el proceso almacenado. Quizás necesites hacer lo que él hizo por IN parámetros y llamar a multi_query() , luego un store_result() , luego un fetch_all() (en resumen, el PHP hace referencia a una página hacia arriba).

Alternativamente, se haría una llamada como lo hizo Palladium aquí .

En cualquier caso, se debe tomar en cuenta para evitar la vulnerabilidad conocida de pasar Inyección SQL a las rutinas de procedimientos almacenados.