创建用户失败,Mysqli 准备语句


CREATE USER fails with Mysqli prepared statements

我正在尝试创建一个简单的PHP脚本来创建属性并将其分配给SQL用户。如果未使用任何参数,则查询工作正常,否则将失败。

工作正常

$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 ?@'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();

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

使用预准备语句,您只能使用有限的查询子集。不包括创建用户。

您可以尝试插入到mysql.user表中,例如

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

此外,动态创建用户时,您做错了什么

不要在

?两边加上单引号,bind_param() 会处理好它。

但是,还有一个问题,即不能在 MySQL 中对CREATE USER语句使用占位符。

请参阅如何使用MySQL准备的语句编写"创建用户?"以获取执行此操作的方法。