【发布时间】:2019-03-04 20:04:23
【问题描述】:
我遇到了从本地 PHP 站点到本地 MySQL 数据库的间歇性连接问题。它给了我Access Denied for 'user'@'localhost' (using password: YES),这是错误密码的典型情况。我测试以确保它没有什么特别的,我可以用root 得到它,所以我很困惑。我什至用相同的用户名和密码设置了127.0.0.1、localhost 和% 帐户。他们都没有工作,但root 工作得很好。这是我最大的困惑——“root”可以正常工作,但这个新用户根本不工作。
我已经查看了很多问题(见下文)以及 SE 和其他论坛上与 Error 1045, Access Denied 和所有变体相关的问题,大多数归结为拼写错误、拼写错误或类似那种性质。我已经复制并粘贴了所有代码周围的每个相关字符串,所以这不是问题。我没有匿名用户,所以这不是问题。没有 DNS 问题,它是 localhost,我已经尝试过每一次迭代。
问题来自为我解决问题的方法。如果我通过 MySQL Workbench 或 CLI 使用新帐户打开与数据库的连接,突然该网页将毫无问题地工作,通过新帐户连接没有问题。但是,如果我运行更改新帐户信息的脚本,即使我什么也没做,然后重新加载页面,它也会再次拒绝访问,直到我通过 MySQL Workbench 或 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(我认为这就是它的名字)。而且我刚刚进行了测试,但在我继续通过 CLI 或 Workbench 重新创建与数据库的新连接之前,它也不适用于 root。
它返回的错误也包括这个,但我从来没有遇到过这个问题,因为我以前从未尝试在任何一个上安装 OpenSSL:mysqli::__construct(): PHP was built without openssl extension, can't send password encrypted in [file]。但是,一旦我通过 CLI(没有花哨的标签或任何东西,所以我认为我没有使用 SSL)或通过 Workbench 建立连接,这种情况就会消失。
编辑 2: 兔子洞变得更深,然后停止了,但我仍然对如何正确配置我的设置以在将来避免它/修复它以更安全感到困惑。解决方案(我不能把它当作我自己的,所以如果你们中的一个人想要解释然后声明这个,那就去吧 - 我会接受它)是回到我的 MySQL 服务器并重新配置 @987654335 @ 不使用Strong Password Encryption,而是选择Legacy Authentication Method。如果有人能解释如何使我的 PHP 与较新的身份验证方法兼容(我还没有看过,但会在我发布后),我将不胜感激。
【问题讨论】:
-
所以让我做对了——您可以使用 MySQL 根用户和密码从您的 PHP 脚本连接到本地 MySQL 服务器,但是如果您将用户/密码更改为另一个用户创建,它不会工作,对吧?
-
我可以执行以下操作:1) 使用 root 登录,通过 PHP、CLI、MySQL Workbench 没有问题 2) 使用其他用户名登录,通过 CLI、MySQL Workbench 没有问题 3) 使用其他用户登录如果我通过 CLI 打开连接,则通过 PHP 使用用户名,自上次运行用于创建凭证的脚本以来,MySQL Workbench(我正在学习,所以我正在本地实例上左右重新创建东西)
-
那时我不知道。如果 CLI 工作并且 MySQL 工作,那应该工作。您确定您没有使用阻止端口 3306(或 MySQL 正在侦听的任何端口)的防火墙吗?您是使用 TCP/IP 还是套接字进行连接?是否在 my.cnf 配置文件中注释掉了“skip_networking”?我真的很茫然。
-
我同意,它应该可以工作。我的防火墙在 3306 上打开。我...不确定是 TCP/IP 还是套接字或如何判断?我正在使用内置的 PHP mysqli OOP 连接(参见上面的代码)。我没有更改任何主要配置。我也无法在我的计算机上的任何地方找到该配置文件(我没有提到我正在使用 WAMP 堆栈)。这是一个非常奇怪的问题 - 它会起作用,但只有在首先通过 CLI/Workbench 登录之后。之后,我就没有问题了,它会连接,推送更新,拉取更新,一切。
-
解决方案是回到我的 MySQL 服务器并重新配置
Authentication Method以不使用Strong Password Encryption而是选择Legacy Authentication Method。我还不知道如何解决这个问题,但我会研究它。
标签: php mysql localhost mysql-workbench mysql-error-1045