sql >> Database teknologi >  >> RDS >> Mysql

ved hjælp af LAGET PROCEDURER:forskellige resultater i mysqli->forespørgsel(CALL select_procedure) VS mysqli->forespørgsel(SELECT ...)

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.




  1. Massesaml ind og udfør øjeblikkeligt i Oracle

  2. mySQL init-scripts kører ikke med docker-compose

  3. Find forskel mellem leder og forrige i resultattabel

  4. PostgreSQL OPRET TABEL