sql >> データベース >  >> RDS >> Mysql

ストアドプロシージャの使用:mysqli-> query(CALL select_procedure)とmysqli-> query(SELECT ...)の結果が異なります。

    プリペアドステートメント を検討してください 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インジェクションを渡すという既知の脆弱性を回避するためにケースを選択する必要があります ストアドプロシージャルーチンに移動します。




    1. WALアーカイブ:失敗しました(WAL出荷が設定されていることを確認してください)

    2. SQLクエリの最適化-実行時間

    3. Amazon RDSMYSQLLinuxサーバーのinnodb_log_file_size変数値を変更します

    4. Ajax、PHP、MYSQLを使用してフォームを更新する