我使用的一些存储过程需要根据是否提供了过程输入参数来插入 WHERE 条件。为了避免潜在的注入点,我想对将成为内插标准的一部分的值使用参数绑定。
由于添加到准备好的语句中的条件以及要绑定的参数数量可能因用户输入而异,因此我设计了以下方法来确定将哪些变量传递给 EXECUTE 语句。这有效,但似乎不优雅。
CREATE PROCEDURE foo (IN mandatory INT, IN optional INT, IN optional2 VARCHAR(20))
BEGIN
SELECT
0, '', '', mandatory, optional, optional2
INTO
@params, @sql, @where, @m, @o1, @o2;
IF (@o1 > '' AND @o1 IS NOT NULL) THEN
SET @where = CONCAT(@where, ' AND field = ?');
SET @params = @params + 1;
END IF;
IF (@o2 > '' AND @o2 IS NOT NULL) THEN
SET @where = CONCAT(@where, ' AND field2 = ?');
SET …
Run Code Online (Sandbox Code Playgroud)