Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwendung von STORED PROCEDURES:unterschiedliche Ergebnisse in mysqli->query(CALL select_procedure) VS mysqli->query(SELECT ...)

Betrachten Sie vorbereitete Anweisungen verwendet mit concat() wie so oft.

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 ;

Ihre gespeicherte Prozedur hatte keine Chance zu funktionieren, da sie nicht einmal Ihren Parameter verwendete. Was Sie getan haben, war, etwas in einem String-Literal zu begraben. Außerdem ist varchar(124) etwas seltsam :p

Der einzige Erfolg, den Menschen mit vorbereiteten Anweisungen haben, ist die Verwendung einer Benutzervariablen (mit einem @ ) gegenüber fehlgeschlagenen Versuchen, lokale Variablen (von DECLARE) zu verwenden. Das kann dir also in Zukunft ein paar Stunden Headbangen ersparen.

Von der PHP-Handbuchseite Gespeicherte Prozeduren :

Wie beim Aufrufen der gespeicherten Prozedur von mysqli , werfen Sie bitte einen Blick auf die Antwort von Pablo Tobar. Es sieht mit vielen Variablen nicht besonders angenehm aus, aber das scheint es zu sein. Spoiler-Alarm:Verwenden Sie MySQL-Variablen, keine PHP-Variablen.

Zugegeben, Pablo hat keine Ergebnismenge zurückgegeben, sondern in ein OUT geschrieben var in der gespeicherten Prozedur. Vielleicht müssen Sie tun, was er für IN getan hat Parameter und rufen Sie multi_query() auf , dann ein store_result() , dann ein fetch_all() (Kurz gesagt, die PHP-Referenz eine Seite nach oben).

Alternativ würde ein Aufruf wie von Palladium hier getätigt werden .

In jedem Fall muss beachtet werden, dass die bekannte Schwachstelle der Weitergabe von SQL Injection vermieden wird zu Routinen gespeicherter Prozeduren übergehen.