我有休耕存儲過程:通用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