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.