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.