2013-12-17 70 views
2

我想:如何寫「創建用戶?」使用MySQL準備好的語句

SET @user = '[email protected]'; 
SET @pass = 'bar'; 
SET @sql = 'CREATE USER ? IDENTIFIED BY ?'; 
PREPARE stmt FROM $sql; 

,我得到錯誤

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? IDENTIFIED BY ?' 

我也嘗試過多種變體如何定義變量,但還是沒有任何的運氣。

SET @user = "'foo'@'localhost'"; 
SET @sql = 'CREATE USER ? IDENTIFIED BY ?'; 

甚至

SET @user = 'foo'; 
SET @host = 'localhost'; 
SET @sql = 'CREATE USER [email protected]? IDENTIFIED BY ?'; 

相當類似的問題已經被問2年多前,但仍然沒有有用的答案:( Create User with MySQLi Prepared Statement

+1

開始得到支持? –

+0

@ElliottFrisch在這種情況下,只需從控制檯輸入MySQL,但如果需要,我也可以使用PHP。 – DarkSide

回答

2

這是唯一的出路如何我成功地創建一個用戶,遺憾的是它並沒有使用佔位符用戶變量:

SET @user := 'foo'; 
SET @host := 'localhost'; 
SET @pass := 'bar'; 
SET @sql := CONCAT("CREATE USER ", QUOTE(@user), "@", QUOTE(@host), " IDENTIFIED BY ", QUOTE(@pass)); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 

P.S. {CREATE | RENAME | DROP} USER語句應該是您使用的編程語言從MySQL 5.1.12

+1

1用於legitmiate使用的['QUOTE()'](http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_quote),其是真正的sanest件事,可以在這裏完成,因爲'CREATE USER'不支持'?'佔位符。只要初始設置變量時沒有注入機會(如果存在的話,可以通過首先準備並執行SET @user =?...等來修復),或者將args傳遞到存儲過程中代碼(可能,我猜)生活,這應該是一個勝利者。 –

+0

@ Michael-sqlbot,另一件事,沒有使用預處理語句的性能優勢,因爲不使用佔位符... –

+1

確實,必須爲每次運行重新準備,但如果有人正在創建新的MySQL服務器用戶他們擔心他們能夠以多快的速度完成任務,然後他們有一個全新的問題。我認爲在這種情況下,OP使用準備好的聲明的動機是安全而不是表現。 –