2014-12-25 57 views
1

我想寫一個簡單的存儲過程插入參數作爲表名稱和插入值。存儲過程不工作php mysql

DELIMITER $$ 
DROP PROCEDURE IF EXISTS TEST3; 
CREATE PROCEDURE TEST3(IN tab_name VARCHAR(40),IN IDVALUE VARCHAR(40)) 
BEGIN 
SET @t2 = CONCAT('INSERT INTO ? (id) VALUES(?)'); 
PREPARE stmt4 FROM @t2; 
EXECUTE stmt4 USING @tab_name, @IDVALUE; 
DEALLOCATE PREPARE stmt4; 
END $$ 
DELIMITER ; 

正在創建它,但是當我把它稱爲它拋出以下錯誤:

ERROR 1064(42000):你在你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在''附近使用正確的語法'? (id)VALUES(?)'在行1

這是什麼我做錯了。

回答

3

如果你需要這個,你可以做這樣的

DELIMITER $$ 
CREATE PROCEDURE TEST3(IN tab_name VARCHAR(40), IN IDVALUE VARCHAR(40)) 
BEGIN 
SET @t2 = CONCAT('INSERT INTO `', tab_name, '` (id) VALUES(?)'), 
    @id = idvalue; 

PREPARE stmt4 FROM @t2; 
EXECUTE stmt4 USING @id; 
DEALLOCATE PREPARE stmt4; 
END$$ 
DELIMITER ; 

這裏是一個SQLFiddle演示


兩個與你原來的代碼主要問題是:

  1. 你不能沒有一個準備一個聲明對象標識符,你的案例中的表名。對象標識符是靜態的。要解決這個問題,你應該將表名連接到你的語句中。

  2. 本地(IDVALUE你的情況)和用戶(會話)變量(@IDVALUE)是兩個完全不同的野獸。而EXECUTE ... USING只能與後者一起使用。因此,您需要將一個值IDVALUE分配給會話變量(在我的示例中爲@id)。

延伸閱讀:

+1

完美答案。我曾試着連接'tab_name',但不知道你提到的第二個問題。 – user2850305

+0

這個語句對於參數IDVALUE的sql注入是否免疫? – user2850305

+0

是的,它是免疫的。 – peterm

0

嘗試運行此查詢,它在phpMyAdmin工作對我來說

CREATE PROCEDURE `sample_procedure`(IN `10` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER SELECT "print this";