Mysql
 sql >> Base de données >  >> RDS >> Mysql

en utilisant STORED PROCEDURES :résultats différents dans mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

considérez Déclarations préparées utilisé avec concat() comme souvent.

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 ;

Votre proc stocké n'avait aucune chance de fonctionner car il n'utilisait même pas votre paramètre. Ce que vous avez fait, c'est enterrer quelque chose à l'intérieur d'un littéral de chaîne. Aussi, varchar(124) est un peu bizarre :p

À peu près le seul succès que les gens ont avec des instructions préparées est d'utiliser une variable utilisateur (avec un @ ) par rapport aux tentatives infructueuses d'utilisation de variables locales (de DECLARE). Donc, cela peut vous faire économiser quelques heures à vous casser la tête à l'avenir.

Depuis la page du manuel PHP Procédures stockées :

En ce qui concerne l'appel de la proc stockée depuis mysqli , veuillez jeter un œil à la Réponse de Pablo Tobar. Cela n'a pas l'air particulièrement agréable avec de nombreuses variables, mais cela semble être là où il en est. Spoiler Alert :utilisez des variables mysql, pas des variables PHP.

Certes, Pablo ne renvoyait pas un jeu de résultats, mais écrivait plutôt dans un OUT var dans la proc stockée. Peut-être que vous devez faire ce qu'il a fait pour le IN paramètres et appelez multi_query() , puis un store_result() , puis un fetch_all() (en bref, le PHP référence une page vers le haut).

Alternativement, un appel serait effectué comme l'a fait Palladium ici .

Dans les deux cas, le cas doit être pris pour éviter la vulnérabilité connue de passage SQL Injection aux routines de procédures stockées.