2016-03-02 70 views
0

我想创建一个简单的PHP脚本来创建和分配给SQL用户的属性。查询工作正常,如果没有参数使用,但失败,否则。创建用户失败Mysqli准备语句

做工精细

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'"; 
$stmt = $conn->prepare($sql); 
$stmt->execute(); 

两个用户名和密码?

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER '?'@'localhost' IDENTIFIED BY '?'"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

两个用户名和密码都在语法?

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = 'CREATE USER "?"@"localhost" IDENTIFIED BY "?"'; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

错误,请检查文档

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER [email protected]'localhost' IDENTIFIED BY ?"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

错误语法,检查文件

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER `?`@'localhost' IDENTIFIED BY `?`"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

我不知道在哪里可以从这里走。这可能是我使用引号的一个问题,我在这里看到两个相关的问题,但没有一个回答正确。

+0

@ Fred-ii-我说这可能是一个问题,不是我确定的。我尝试了所有我能想到的组合,对于所有其他查询,我从不用任何东西来包装'?',它工作正常,但是'bind_param()'失败。 – aron9forever

+0

*“可能”*? - 更像“是”。据我所知,占位符不能有引号和/或剔号。 –

+0

像CREATE TABLE这样的DDL语句不适用于参数。 'CREATE USER'可能是一样的。 – JimmyB

回答

1

使用预处理语句,您只能使用有限的查询子集。创建用户不包括在内。

您可以尝试INSERT到mysql.user表,像

INSERT INTO `mysql`.`user` (Host,User,Password)VALUES(?,?,password(?)); 

此外,随着创建的用户动态,你正在做的事情错

+0

所以不可能这样做?如果所有的名字和密码都是由我生成的,而不是用户输入的,那么我应该不使用params吗? – aron9forever

+0

由于没有用户输入,因此决定不带参数化,用户名是通过将数字标识附加到单词中生成的,而密码只是随机字母字符。 – aron9forever

1

不要把周围的?,bind_param单引号()将搞定此事。

但是,还有另一个问题是您不能在MySQL中使用CREATE USER语句的占位符。请参阅How to write "create user ?" with MySQL prepared statement

+0

谢谢,看第四个例子,我就是这样写的,我只是在发布问题之前尝试了所有我能想到的引用组合。 – aron9forever