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.