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
问问题
918 次
1 回答
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 (?)');
于 2012-06-11T10:21:23.557 回答