CREATE PROCEDURE P1 (
IN input TEXT
, IN `delimiter` VARCHAR(10)
, IN `column1` VARCHAR(10)
, IN `value1` VARCHAR(10)
)
BEGIN
SET @a = column1;
SET @b = value1;
select @a,@b;
SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (',@b,')');
select @c;
PREPARE stmt FROM @c;
select stmt;
EXECUTE stmt;
END
答案 0 :(得分:2)
您将未加引号的字符串连接到预准备语句中。假设一个人调用P1
如下:
CALL P1('qux', 'foo', 'bar');
然后@c
将包含以下字符串:
INSERT INTO SplitValues2(foo) VALUES (bar)
这可能不是您想要的,因为它引用了名为foo
的列和一些名为bar
的其他标识符。您可以考虑使用MySQL的QUOTE()
函数来正确引用字符串值:
SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (',QUOTE(@b),')');
或者更好地参数化预准备语句中的变量,以便在执行时传递它们:
SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (?)');
PREPARE stmt FROM @c;
EXECUTE stmt USING @b;
请注意,既不能参数化SQL标识符(例如列名),也不能使用QUOTE()
引用这些标识符。因此,为了避免SQL注入攻击,应该手动引用和转义:
SET @c = CONCAT('INSERT INTO SplitValues2(`',REPLACE(@a,'`','``'),'` VALUES (?)');