【问题标题】:Issue connecting to MySQL with mysqli in PHP [duplicate]在 PHP 中使用 mysqli 连接到 MySQL 的问题 [重复]
【发布时间】:2017-07-13 10:24:50
【问题描述】:

浏览了大量答案,但没有一个与我的问题完全相符。

我有一个 MySQL 数据库正在运行,并试图在 PHP 中使用 mysqli 进行连接。连接代码如下:

<?php
    if(!isset($_COOKIE["uid"])) {

            $servername = "localhost";
            $username = "study";
            $password = "somepassword";
            $dbname = "user_study";
            $conn = new mysqli($servername, $username, $password, $dbname);
            if($conn->connect_error){
                    die("aww");
            }
}

但是每次我得到错误

mysqli::mysqli(): (28000/1045): 拒绝用户访问 'study'@'localhost'(使用密码:YES)

我知道用户'study'@'localhost' 有权访问这个数据库,因为我可以通过 MySQL 命令行访问它。我尝试了其他帐户,例如具有相同结果的 root。

还有什么我应该检查的吗?


新信息 (2/23) 似乎即使我关闭了数据库,我也会得到拒绝访问的结果,这意味着它似乎正在尝试连接到服务器上的其他数据库。我如何确保它连接到正确的?

【问题讨论】:

  • 尝试将您的主机从 localhost 更改为 %。任何主机
  • 接受任何主机时没有任何变化
  • 试试这个:$con = mysqli_connect("localhost","my_user","my_password","my_db");
  • 试过了,还是一样的错误。
  • 你试过没有 if 条件吗? if not 删除 if 语句,然后尝试连接。

标签: php mysql mysqli


【解决方案1】:

我认为错误消息表明 PHP 能够使用套接字文件联系 MySQL 服务器。 (否则会出现不同的错误。)

您可能会收到此错误有几个原因。如果我们可以像这样使用 mysql 命令行客户端成功连接到 MySQL 服务器:

> mysql --no-defaults -h localhost -u study -psomepassword user_study

这将排除很多可能的失败原因。

对来自 PHP 的错误消息最合理的解释是,在 PHP 的连接尝试中提供的密码与 MySQL 期望的密码匹配。


我们应该能够排除的一些想法。 user_study 数据库的权限已授予'study'@'localhost',例如

 GRANT SELECT ON user_study.* TO 'user'@'localhost'

鉴于赋值语句,采用完全不同的策略:

 $password = "somepassword";

假设您不会在问题中提供 actual 密码...我们想知道 actual 密码是否包含受以下约束的字符PHP 字符串解释,例如反斜杠字符或美元符号。

为了调试,我建议在赋值之后执行echo $password;,并验证发出的字符串是否符合预期。

另一种可能性是 mysql.user 表中没有完全匹配,并且用户 'study' 实际上匹配到不同的 mysql.user... 一个带有空用户 ''@'localhost' 的条目。

我将查看mysql.user 表中 user='study' 和 user='' 的所有条目。

我也想排除mysql命令行客户端使用.mylogin.cnf文件的可能性。

我也很想建议将更改应用于 mysql.user 表并且未执行 FLUSH PRIVILEGES 语句......但这与在 mysql 中观察到的行为(成功连接)不符命令行客户端。


我们显然假设 MySQL 服务器在本地运行,在 PHP 正在执行的同一台机器上。我们希望通过本地套接字文件进行连接。

作为测试,我建议通过 TCP 连接。将主机指定为 127.0.0.1。这将需要 mysql.user 表中的不同条目。我们将从 mysql 命令行客户端测试连接:

> mysql --no-defaults -h 127.0.0.1 -u study -psomepassword user_study

但这涉及到 MySQL 服务器、启用网络、绑定地址、DNS 名称解析、侦听端口、iptables、防火墙等的一大堆其他配置问题。

--

如果问题是不受支持的身份验证协议,我预计会出现不同的错误。如果问题是无法连接到套接字文件,我也预计会出现不同的错误。

此错误的所有常见原因似乎都可以通过命令行客户端的成功连接、在本地计算机上运行、使用相同的凭据进行连接来排除。

【讨论】:

  • 你是完全正确的 mysql --no-defaults -h localhost -u study -psomepassword user_study 也失败了。目前研究显示的特权:为 study@localhost 授予所有特权 . TO 'study'@'localhost' IDENTIFIED BY PASSWORD '*hash' 我已经检查并清除了所有 ''@'localhost '用户。但是,由于我目前受到的限制,我正在使用 .cnf 文件。 (服务器托管多个站点)。会不会是什么原因造成的?
  • 当你“清除”了 ''@'localhost' 用户时,如果你使用了 DML 操作,那么你需要发出一个FLUSH PRIVILEGES 语句以使这些更改生效。我会比较密码哈希值。获取您正在使用的密码的哈希值SELECT PASSWORD('somepassword'),并将其与 mysql.user 中密码列的内容进行比较,以确保它们相同。
  • 刷新权限无效。我已经比较了密码哈希并且它们匹配。
  • 新信息 - 即使我关闭数据库也会发生同样的错误,这意味着它正在尝试连接到其他数据库。关于如何强制它连接到正确的任何想法?
  • 我们不会在一台虚拟机上运行多个 MySQL 实例,我们的大部分连接都是通过默认 TCP 端口 (mysql -P 3306) 路由的,而不是特殊的 localhost unix 套接字文件。 dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html我不知道你的环境,socket文件在哪里,mysql客户端和PHP在哪里寻找socket文件,以及你配置了多少个MySQL Server实例。而且我对您尝试连接的数据库上的网络配置方式(--bind-address、--skip-name-resolve 等)一无所知。
猜你喜欢
  • 2010-11-30
  • 2019-10-03
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多