SQLSTATE[HY000] [2003] 无法连接到“127.0.0.1”(13) 上的 MySQL 服务器,但“localhost”可以工作

SQLSTATE[HY000] [2003] 无法连接到“127.0.0.1”(13) 上的 MySQL 服务器,但“localhost”可以工作

Cent os Apache + php + MySQL from php 当你尝试连接地址 127.0.0.1 的 MySQL 时,会发生错误。如果您更换一条线路127.0.0.1localhost一切正常,没有问题。浏览器中 php 的唯一问题。如果控制台执行

php -r "var_dump (mysqli_connect ( '127.0.0.1', 'user', 'pass', 'db_name'))"

没有错误。另外,如果控制台输入

mysql -u user -h 127.0.0.1 -p db_name

或者

mysql -u user -h localhost -p db_name

同样,一切正常。可能是什么问题呢?

软件版本

  • PHP-5.6.26
  • MySQL-5.5.53
  • 阿帕奇2.2.15

最后,

$ host localhost
localhost has address 127.0.0.1

php代码工作:

$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

php 代码不工作:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';

    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }

SQLSTATE[HY000] [2003] 无法连接到“127.0.0.1”上的 MySQL 服务器 (13)

php代码工作:

$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

php 代码不工作:

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

解决方案:

setsebool httpd_can_network_connect_db on

答案1

根据StackOverflow 上的这个(未接受的)答案,原因是MySQLlocalhost对.的解释不同127.0.0.1。这是文档中确认,参见开头的段落,“在 Unix 上,MySQL 程序处理主机名localhost在 Unix 上,MySQL 程序特殊”。

  • 127.0.0.1是一个显式的 IPv4 地址,因此客户端尝试通过 TCP/IP 进行连接
  • localhost是使用本地主机的隐式提示,MySQL 在可能的情况下通过本地套接字而不是 TCP/IP 来实现

由于您的localhost连接有效,但127.0.0.1另一个连接无效,因此这些问题之一似乎可能是罪魁祸首:

  • 您的数据库权限拒绝来自的连接127.0.0.1
  • 您有防火墙规则阻止所有通过 TCP/IP 的入站数据库连接尝试
  • 您已更改bindMySQL 的配置条目,以便它不会绑定到环回地址

给出错误代码 13 (没有权限),我会先研究其中的第一个,然后再研究其他两个。

相关内容