zvažte Připravená prohlášení
používá se s concat()
jak často jsou.
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 ;
Váš uložený proces neměl šanci fungovat, protože ani nepoužíval váš parametr. To, co jsi udělal, bylo pohřbít něco uvnitř řetězcového doslovu. Také varchar(124) je trochu zvláštní :p
Jediným úspěchem, který lidé mají s připravenými příkazy, je použití uživatelské proměnné (s @
) versus neúspěšné pokusy o použití místních proměnných (od DECLARE). Takže vám to může v budoucnu ušetřit několik hodin bouchání do hlavy.
Z manuálové stránky PHP Uložené procedury :
Pokud jde o volání uloženého proc z mysqli
, podívejte se prosím na Odpověď
od Pabla Tobara. S mnoha proměnnými to nevypadá nijak zvlášť příjemně, ale zdá se, že tam je. Upozornění na spoiler:použijte proměnné mysql, nikoli proměnné PHP.
Je pravda, že Pablo nevracel sadu výsledků, ale spíše zapisoval do OUT
var v uloženém proc. Možná budete muset udělat to, co udělal pro IN
parametry a zavolejte multi_query()
a poté store_result()
a poté fetch_all()
(stručně řečeno, PHP odkazuje o stránku výše).
Alternativně lze zavolat tak, jak to provedla společnost Palladium zde .
V obou případech je třeba postupovat tak, aby se předešlo známé zranitelnosti předávání SQL Injection k rutinám uložených procedur.