【发布时间】:2019-06-19 10:35:19
【问题描述】:
我正在尝试在 PHP7.0 中在运行时创建一个 mysql 用户帐户,授予对单个数据库的访问权限,该数据库也是在运行时创建的。 我目前正在使用:
$this->mysqli = new mysqli('localhost', $admin_account, $password);
$setup = [
/* create database */
sprintf('CREATE DATABASE IF NOT EXISTS %s;', $dbName),
/* grant admin */
sprintf("GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%s' WITH GRANT OPTION;", $dbName, $admin_account, $admins_remote_ip),
/* add user */
sprintf("CREATE USER '%s'@'localhost' IDENTIFIED BY '%s';", $dbUsername, $dbPassword),
/* THIS WAS ADDED AS A FIX TO NO AVAIL */
sprintf("UPDATE mysql.user SET password=PASSWORD('%s') WHERE user='%s'", $dbPassword, $dbUsername),
/* grant retailer*/
sprintf("GRANT ALL PRIVILEGES ON %s.* TO '%s'@'localhost';", $dbName, $dbUsername),
/* flush */
"FLUSH PRIVILEGES;",
];
foreach ($setup as $query) {
if (false == $this->mysqli->query($query)) {
$error = $this->mysqli->error;
return $error;
}
}
所有语句都执行没有错误,一切似乎都在它应该的位置,但是非管理员用户得到一个 mysql->错误;
连接失败:用户 'dbUsername'@'localhost' 的访问被拒绝(使用密码:YES)
如果我这样做;
> mysql -u admin_account -p
update mysql.user set password=PASSWORD('dbPassword') where user='dbUsername';
然后连接正常,一切正常。 请帮忙。
*edit:我已经删除了事务行为,从实时代码中删除它并没有解决问题。密码字符串似乎在 PHP 和 MySQL 之间的某个地方被更改?
【问题讨论】:
-
您检查过
mysqli是否返回任何错误消息吗? -
UPDATE mysql.user …语句应该有什么用?上面那个,CREATE USER … IDENTIFIED BY 'password'应该已经在创建用户时为用户设置了密码......? -
请注意 - 事务和 DDL 语句并不能真正协同工作。
-
是的,我正在检查错误,并添加了 UPDATE mysql.user 行来修复或进一步检查错误。
-
如果您的密码中有单引号怎么办?出于对安全的热爱,请使用
mysqli_real_escape_string逃避您的输入。另请注意,您可以在单个查询中执行授权:GRANT ALL PRIVILEGES ON %s.* TO '%s'@'localhost' IDENTIFIED BY '%s'将一次性创建用户、授予访问权限并设置密码。
标签: php mysql user-permissions