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

utilizzando STORED PROCEDURES:risultati diversi in mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

considera Dichiarazioni preparate utilizzato con concat() come spesso accade.

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 ;

Il tuo processo memorizzato non ha avuto possibilità di funzionare in quanto non utilizzava nemmeno il tuo parametro. Quello che hai fatto è stato seppellire qualcosa all'interno di una stringa letterale. Inoltre, varchar(124) è un po' strano :p

L'unico successo che le persone hanno con le istruzioni preparate è l'utilizzo di una variabile utente (con un @ ) rispetto ai tentativi falliti di utilizzare le variabili locali (da DECLARE). Quindi, questo potrebbe farti risparmiare qualche ora di headbanging in futuro.

Dalla pagina del manuale PHP Procedure archiviate :

Per quanto riguarda la chiamata del processo memorizzato da mysqli , dai un'occhiata alla Risposta di Pablo Tobar. Non sembra particolarmente piacevole con molte variabili, ma sembra che sia così. Avviso spoiler:usa variabili MySQL, non variabili PHP.

Certo, Pablo non stava restituendo un set di risultati, ma piuttosto scrivendo a un OUT var nel proc memorizzato. Forse devi fare quello che ha fatto per IN parametri e chiama multi_query() , quindi un store_result() , quindi un fetch_all() (in breve, il PHP fa riferimento a una pagina su).

In alternativa, una chiamata potrebbe essere effettuata da Palladium qui .

In entrambi i casi, è necessario prendere in considerazione per evitare la vulnerabilità nota del passaggio di SQL Injection oltre alle routine di stored procedure.