sql >> Database >  >> RDS >> Mysql

met behulp van OPGESLAGEN PROCEDURES:verschillende resultaten in mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

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.




  1. Mysql-query. Wat is het verschil tussen deelnemen en een subquery?

  2. PHP, haal gegevens uit de database

  3. OracleLob als parameter doorgeven aan een functie

  4. Negeer dubbele vermeldingen en leg succesvolle vast in DbContext.SaveChanges() in EF Core