![SQLSTATE[HY000] [2003] 无法连接到“127.0.0.1”(13) 上的 MySQL 服务器,但“localhost”可以工作](https://linux22.com/image/97160/SQLSTATE%5BHY000%5D%20%5B2003%5D%20%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E2%80%9C127.0.0.1%E2%80%9D(13)%20%E4%B8%8A%E7%9A%84%20MySQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E4%BD%86%E2%80%9Clocalhost%E2%80%9D%E5%8F%AF%E4%BB%A5%E5%B7%A5%E4%BD%9C.png)
Cent os Apache + php + MySQL from php 当你尝试连接地址 127.0.0.1 的 MySQL 时,会发生错误。如果您更换一条线路127.0.0.1
,localhost
一切正常,没有问题。浏览器中 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 的入站数据库连接尝试
- 您已更改
bind
MySQL 的配置条目,以便它不会绑定到环回地址
给出错误代码 13 (没有权限),我会先研究其中的第一个,然后再研究其他两个。