我有休耕存储过程:通用MySQL存储过程
CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER)
BEGIN
SELECT * FROM tb WHERE Indx = id;
END//
当我调用get(用户,1)我得到以下几点:
ERROR 1054 (42S22): Unknown column 'user' in 'field list'
我有休耕存储过程:通用MySQL存储过程
CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER)
BEGIN
SELECT * FROM tb WHERE Indx = id;
END//
当我调用get(用户,1)我得到以下几点:
ERROR 1054 (42S22): Unknown column 'user' in 'field list'
您不能在SQL中将变量用作表名,因为它在编译过程时编译该变量。尝试使用准备好的语句:
CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER)
BEGIN
PREPARE stmt1 FROM CONCAT('SELECT * FROM ', tb, ' WHERE Indx = id');
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END//
但请注意,这会变慢。
怎么样SQL注入?它安全吗?我没有看到针对它的任何安全措施,“tb”可以是任何例如子查询。 – 2010-04-04 20:50:33
,你可以把它作为get('user',1)
?
IN tb VARCHAR(50)
使它期望一个'字符串',你传递的东西是SQL分析器解释为字段user
,这是不知道的。
这只是不工作。如果您想使用动态表名称,则需要使用准备好的语句。但是我不认为在这种情况下,首先要有一个存储过程。 – 2010-04-04 18:05:40