我遇到了我的一个老项目(使用mysql 5和php5.5)。我只是想用mysql 8和php7.0测试这个项目。要安装db,我通常会执行以下操作:
...
mysql -u root -p < DBinstall/webAppDBinstall.sql
...
在我的web应用的“安装”脚本中。sql命令包含:
...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...
然后我在运行webapp时从php得到以下错误: $ cat /var/log/apache2/error.log
```
...
[Thu May 28 06:01:26.317867 2020] [:error] [pid 8906] [client 127.0.0.1:32960] PHP Warning: mysqli::query(): Couldn't fetch mysqli in /var/www/webApp/src_php/mylib.php on line 68, referer: http://webApp/index.php?error=0
...
注意:这个项目使用mysql 5和php5运行得非常完美。
然后我觉得“闻起来”就像是特权问题。所以我做了以下工作:
mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------+------------+
| User | Table_name | Table_priv |
+------------+------------+------------+
| php_script | History | Insert |
| php_script | OrderItems | Update |
| php_script | Orders | Update |
| php_script | UserStatus | Update |
+------------+------------+------------+
4 rows in set (0.00 sec)
mysql>
### 是的,就是这样。
证据如下:
我改变了主意 `DBinstall/webAppDBinstall.sql` 脚本来自:
...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...
收件人:
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.Users TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Categories TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.ProductGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.CategoriesGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Products TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Orders TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Messages TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.History TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
结果是:
mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------------+----------------------+
| User | Table_name | Table_priv |
+------------+------------------+----------------------+
| php_script | History | Select,Insert |
| php_script | Categories | Select,Insert |
| php_script | CategoriesGroups | Select,Insert |
| php_script | Messages | Select,Insert |
| php_script | OrderItems | Select,Insert,Update |
| php_script | Orders | Select,Insert,Update |
| php_script | ProductGroups | Select,Insert |
| php_script | Products | Select,Insert |
| php_script | UserStatus | Select,Insert,Update |
| php_script | Users | Select,Insert |
+------------+------------------+----------------------+
10 rows in set (0.00 sec)
mysql>
#### 关于“为什么在grants中使用通配符”还有更好的想法吗???
(抱歉重复我的问题,但stackoverflow禁止我回答自己的问题)
我的问题是:为什么 `GRANT <PRIVS> ON <DB>.* TO <USER>;` 通配符语法已停止“工作”
注意:此问题与mysqli::query()不同:无法获取mysqli。我的webapp应用程序是一个在mysql 5.x部署下完美运行的系统。它与php无关(尽管 `mysqli` 错误似乎存在,但事实并非如此)。
1条答案
按热度按时间o8x7eapl1#
我刚刚在mysql 8服务器上做了一个测试,成功运行了以下内容:
正如我所料,通配符拨款没有任何问题。所以,恐怕你需要在别的地方搜索这个问题。
例如,其中一个示例上的目标数据库名为
webApp
下一个例子的例子是webAppDB
. 所以,最好检查一下名字的一致性。否则,mysql 8的代码语法看起来还可以。
[编辑]-其他建议
确保
skip-name-resolve
设置为关闭。在mysql 8上,它看起来是默认关闭的,但是在某些情况下,它可能被设置为打开。
在我的例子中,我在docker容器中运行mysql 8,并且该变量被设置为on。
如果变量设置为on,mysql将不会将localhost解析为localhost的实际ip,在您的情况下,这可能就是问题所在。
有关跳过名称解析的详细信息,请单击此处:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve
确保用
FLUSH PRIVILEGES;
尝试切换default-authentication-plugin
至mysql_native_password
默认情况下在mysql 8上default-authentication-plugin
设置为caching_sha2_password
. 但看起来mysqli不支持这种身份验证方法(根据2018年的这篇文章:https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/)