overvej Forberedte erklæringer
bruges sammen med concat()
som de ofte er.
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 ;
Din lagrede proc havde ingen chance for at virke, da den ikke engang brugte din parameter. Det du gjorde var at begrave noget inde i en streng. Også varchar(124) er lidt mærkeligt :p
Omtrent den eneste succes, folk har med forberedte udsagn, er at bruge en brugervariabel (med en @
) kontra mislykkede forsøg på at bruge lokale variabler (fra DECLARE). Så det kan spare dig for et par timers hovedbank i fremtiden.
Fra PHP-manualsiden Lagrede procedurer :
Med hensyn til at kalde den lagrede proc fra mysqli
, tag et kig på svaret
fra Pablo Tobar. Det ser ikke særlig behageligt ud med mange variabler, men det ser ud til at være der, det er. Spoiler Alert:brug mysql-variabler, ikke PHP-variabler.
Indrømmet, Pablo returnerede ikke et resultatsæt, men skrev snarere til en OUT
var i den lagrede proc. Måske skal du gøre, hvad han gjorde for IN
parametre, og kald multi_query()
, derefter en store_result()
, derefter en fetch_all()
(kort sagt, PHP henviser en side op).
Alternativt ville et opkald blive foretaget af Palladium her .
I begge tilfælde skal sagen tages for at undgå den kendte sårbarhed ved at bestå SQL-injektion over til lagrede procedurerutiner.