sql >> Databáze >  >> RDS >> Mysql

pomocí STORED PROCEDURES:různé výsledky v mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

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.




  1. změna mysql innodb_large_prefix

  2. Jak získat záznamy za posledních 30 minut v MS SQL?

  3. Chyba v dynamickém příkazu PL/PGSQL (funkce a operátory mohou mít maximálně jeden argument)

  4. Volejte webovou službu BI Publisher pomocí ReportRawData