2009-05-20 6 views
2

私は入力変数を持つストアドプロシージャを持つmysqlを使用しています。mysqlクエリのヘルプ(like文)

この変数をselect文(like節付き)で使用したいと思います。

例:呼び出し側が適切にストアドプロシージャへの呼び出しをパラメータ化していない場合

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `DeleteDataByTransactionID` $$ 
CREATE DEFINER=`root`@`%` PROCEDURE `DeleteDataByTransactionID`(in **$TransactionID** varchar(50)) 

BEGIN 

delete from sqlstatements where tempsql like '%'+ **$TransactionID** + '%'; 

END $$ 


DELIMITER ; 

おかげ

答えて

8
DELIMITER $$ 
DROP PROCEDURE IF EXISTS `DeleteDataByTransactionID` 
$$ 
CREATE DEFINER=`root`@`%` PROCEDURE `DeleteDataByTransactionID`(TransactionID VARCHAR(50)) 
BEGIN 
     DELETE 
     FROM sqlstatements 
     WHERE tempsql LIKE CONCAT('%', TransactionID, '%'); 
END 
$$ 
DELIMITER ; 
2

は実際には、受け入れ答えのバージョンでは、SQLインジェクションに開いています。私はストアドプロシージャのプリペアドステートメントを呼び出し元に頼るのではなく、安全であるように次のように利用することをお勧めします。

DELIMITER $$ 
CREATE PROCEDURE `DeleteDataByTransactionID` 
(
    TransactionID VARCHAR(50) 
) 
BEGIN 

SET @sql = 
"DELETE 
    FROM sqlstatements 
    WHERE 
    tempsql LIKE CONCAT('%', ?, '%')"; 

SET @transid = TransactionID; 

PREPARE stmt FROM @sql; 
EXECUTE stmt USING @transid; 
DEALLOCATE PREPARE stmt; 

END 
$$