pertimbangkan Pernyataan yang Disiapkan
digunakan dengan concat()
seperti yang sering terjadi.
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 ;
Proc Anda yang tersimpan tidak memiliki peluang untuk berfungsi karena bahkan tidak menggunakan parameter Anda. Apa yang Anda lakukan adalah mengubur sesuatu di dalam string literal. Juga, varchar (124) agak aneh :p
Tentang satu-satunya keberhasilan yang dimiliki orang dengan pernyataan yang disiapkan adalah dengan menggunakan Variabel Pengguna (dengan @
) versus upaya gagal menggunakan Variabel Lokal (dari DECLARE). Jadi, hal itu dapat menghemat beberapa jam untuk membenturkan kepala di masa mendatang.
Dari Halaman Manual PHP Prosedur Tersimpan :
Adapun memanggil proc yang disimpan dari mysqli
, silakan lihat Jawaban
dari Pablo Tobar. Itu tidak terlihat sangat menyenangkan dengan banyak variabel, tetapi tampaknya itulah tempatnya. Peringatan Spoiler:gunakan variabel mysql, bukan variabel PHP.
Memang, Pablo tidak mengembalikan hasil, melainkan menulis ke OUT
var dalam proc yang disimpan. Mungkin Anda perlu melakukan apa yang dia lakukan untuk IN
parameter, dan panggil multi_query()
, lalu store_result()
, lalu fetch_all()
(singkatnya, PHP mereferensikan halaman ke atas).
Atau, panggilan akan dilakukan seperti yang dilakukan oleh Palladium di sini .
Dalam kedua kasus, kasus harus diambil untuk menghindari kerentanan yang diketahui dari melewati SQL Injection ke rutinitas prosedur tersimpan.