overweeg Voorbereide verklaringen
gebruikt met concat()
zoals ze vaak zijn.
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 ;
Je opgeslagen proc had geen kans om te werken omdat het je parameter niet eens gebruikte. Wat je deed was letterlijk iets in een string begraven. Ook is varchar (124) een beetje vreemd :p
Ongeveer het enige succes dat mensen hebben met voorbereide uitspraken is het gebruik van een gebruikersvariabele (met een @
) versus mislukte pogingen om lokale variabelen te gebruiken (van DECLARE). Dus dat kan je in de toekomst een paar uur headbangen besparen.
Van de PHP-handleidingpagina Opgeslagen procedures :
Wat betreft het aanroepen van het opgeslagen proces vanuit mysqli
, kijk dan eens naar het Antwoord
van Pablo Tobar. Het ziet er niet bijzonder prettig uit met veel variabelen, maar dat lijkt te zijn waar het is. Spoiler Alert:gebruik mysql-variabelen, geen PHP-variabelen.
Toegegeven, Pablo stuurde geen resultatenset terug, maar schreef naar een OUT
var in het opgeslagen proces. Misschien moet je doen wat hij deed voor de IN
parameters, en bel multi_query()
, dan een store_result()
, dan een fetch_all()
(kortom, de PHP verwijst naar een pagina hoger).
Als alternatief zou een oproep worden gedaan zoals gedaan door Palladium hier .
In beide gevallen moet worden voorkomen dat de bekende kwetsbaarheid van het passeren van SQL-injectie over naar opgeslagen procedureroutines.