2013-12-17 4 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 для законного использования ['QUOTE()'] (http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_quote), который действительно является самой надежной вещью, которая может здесь, так как 'CREATE USER' не поддерживает'? 'заполнители. Пока нет возможности инъекции при первоначальной установке переменных (которые, если есть, могут быть исправлены путем первой подготовки и выполнения «SET @user =?» ... и т. Д.) Или передачи аргументов в хранимую процедуру, где это код (возможно, я предполагаю) живет, это должно быть победителем. –

+0

@ Michael-sqlbot, еще одна вещь, не будет преимуществ производительности подготовленных операторов, поскольку заполнители не используются ... –

+1

Правда, он должен быть переработан для каждого запуска, но если кто-то создает новых пользователей MySQL-сервера что они обеспокоены тем, как быстро это можно сделать, тогда у них есть совершенно новая проблема. Я предполагаю, что мотивация OP для использования подготовленного заявления была скорее безопасностью, чем производительностью в этом случае. –