MySQL - 在我通过 Workbench 或 CLI 连接之前拒绝访问

MySQL - access denied until I connect via Workbench or CLI

我遇到了从本地主机 PHP 站点到本地主机 MySQL 数据库的间歇性连接问题。它返回 Access Denied for 'user'@'localhost' (using password: YES),这是典型的错误密码。我测试了确定它没有什么特别的,我可以用root得到它,所以我很困惑。我什至用相同的用户名和密码设置了一个 127.0.0.1、一个 localhost 和一个 % 帐户。 None 个有效,但 root 工作得很好。这是我最大的困惑 - 'root' 工作没有问题,但这个新用户根本不工作。

我查看了 SE 和其他论坛上与 Error 1045, Access Denied 和所有变体相关的许多问题(见下文)和问题,大多数归结为拼写错误或拼写错误,或类似的东西。我已经复制并粘贴了所有代码周围的每个相关字符串,所以这不是问题。我没有匿名用户,所以这不是问题所在。没有 DNS 问题,它是本地主机,我已经尝试了它的每一次迭代。

问题来自于为我解决了问题。如果我通过 MySQL Workbench 或 CLI 使用新帐户打开与数据库的连接,网页突然可以正常工作,通过新帐户连接也没有问题。但是,如果我 运行 更改新帐户信息的脚本,即使我什么都不更改并重新加载页面,它也会再次拒绝访问,直到我通过 MySQL [= 再次打开该连接为止70=] 或 CLI。

它每次都能正常工作。我不知道发生了什么 - 帐户是否需要通过 CLI 或 Workbench 登录才能通过 PHP 使用?还是我还缺少其他东西?

PHP代码

$servername='localhost';
$username='website';
$password='password';
$database='db_1';

$conn=new mysqli($servername, $username, $password, $database);
if($conn->connect_error) die("connection failed");

MySQL 凭据创建

create user website@'localhost' identified by 'password';
grant SELECT, INSERT, DELETE on db_1.* to 'website'@'localhost';

一些没有帮助的 SO 问题:
MySQL - Access denied for user
access denied for user @ 'localhost' to database ''
"Connect failed: Access denied for user 'root'@'localhost' (using password: YES)" from php function

编辑 1: 我正在 运行 在本地计算机上安装 WAMP 堆栈。我为端口 3306 打开了防火墙(端口 MySQL 正在侦听)。我没有使用 CPanel(我认为这就是所谓的)。而且我刚刚测试过,它不适用于 root,直到我继续并通过 CLI 或 Workbench.

重新创建与数据库的新连接

它返回的错误也包括这个,但我从来没有遇到过这个问题,因为我之前从未尝试在其中任何一个上安装 OpenSSL:mysqli::__construct(): PHP was built without openssl extension, can't send password encrypted in [file]。但是,一旦我通过 CLI 建立连接(没有花哨的标签或任何东西,所以我不认为我在使用 SSL)或通过 Workbench.

建立连接,这种情况就会消失

编辑 2: 兔子洞变得更深然后停止了,但我仍然对如何正确配置我的设置以避免它在 future/fix 这样更安全。解决方案(我不能把它作为我自己的,所以如果你们中的一个人想解释然后声明这个,去吧 - 我会接受它)是回到我的 MySQL 服务器和重新配置 Authentication Method 以不使用 Strong Password Encryption 而是选择 Legacy Authentication Method。如果有人可以解释如何使我的 PHP 与较新的身份验证方法兼容(我还没有看过,但会在 post 之后看到)我将不胜感激。

解决方案是回到我的 MySQL 服务器并重新配置 Authentication Method 以不使用 Strong Password Encryption 而是选择 Legacy Authentication Method.