プリペアドステートメント
を検討してください concat()
>
よくあることですが。
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 ;
ストアドプロシージャは、パラメータを使用していなかったため、機能する可能性はありませんでした。あなたがしたことは、文字列リテラルの中に何かを埋めることでした。また、varchar(124)は少し奇妙です:p
プリペアドステートメントで成功するのは、ユーザー変数( @
を使用)を使用することだけです。 )対ローカル変数の使用の失敗(DECLAREから)。ですから、これにより、将来、頭を叩く時間を数時間節約できる可能性があります。
PHPマニュアルページから
mysqli
からストアドプロシージャを呼び出す場合 、回答
をご覧ください。 PabloTobarから。それは多くの変数で特に快適に見えませんが、それはそれがどこにあるようです。ネタバレ注意:PHP変数ではなくmysql変数を使用してください。
確かに、Pabloは結果セットを返すのではなく、 OUT
に書き込んでいました。 ストアドプロシージャのvar。おそらくあなたは彼がIN
のためにしたことをする必要があります パラメータを入力し、 multi_query()
を呼び出します 、次に store_result()
、次に fetch_all()
(要するに、PHPはPage Upを参照します。)
または、Palladium こちら のように電話をかけます。 。
いずれの場合も、SQLインジェクションを渡すという既知の脆弱性を回避するためにケースを選択する必要があります ストアドプロシージャルーチンに移動します。