通过localhost连接MySQL无法工作,但127.0.0.1可以工作。

12

操作系统:Ubuntu 14.04 LTS

PHP版本控制:phpbrew

PHP版本:5.5.10

我对本地主机进行了ping测试,解析到了127.0.0.1。

这表明我的主机(/etc/hosts文件)正确无误。

127.0.0.1 localhost
无论何时我尝试使用以下类似的php脚本连接MySQL,它都无法工作并给出错误:没有这样的目录。
    //connect to the database
    mysql_connect("localhost","root","password") or die(mysql_error());

然而,当我使用 127.0.0.1 连接时,它可以工作

 //connect to the database
        mysql_connect("127.0.0.1","root","password") or die(mysql_error());

此外,在使用“localhost”登录时,我的phpmyadmin无法正常工作,我必须更改文件以在登录时添加127.0.0.1选项。

我该如何使用localhost连接到MySQL数据库?


警告:如果你正在学习PHP,请不要学习过时的mysql_query接口。它很糟糕,并且在未来的PHP版本中将被删除。像PDO这样的现代替代方案并不难学。像PHP之道这样的指南可以帮助解释最佳实践。一定要确保你的用户参数已经正确转义,否则你将会有严重的SQL注入漏洞 - tadman
同意。我正在处理遗留代码,只是在迁移服务器。 - JoeCodeCreations
3个回答

7

PHP仍在尝试使用默认的套接字位置。如果您已经将MariaDB/MySQL文件夹从/var/lib/mysql移动到另一个位置,则可能会出现此问题。为了解决这个问题,您需要在/etc/php.ini文件中定义新的套接字位置。

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

请注意,根据您使用的驱动程序不同,您可能需要指定 pdo_mysql.default_socket=

为了检查您当前的目录,请在mysql中运行以下命令:

select @@datadir;

1
这解决了我的问题,为了找到mysql正在使用哪个socket文件,我运行了mysqladmin variables | grep socket命令,它指向/tmp/mysql.sock。(OS X Sierra) - kubilay

6
在许多情况下,localhost 是使用 UNIX 套接字连接到 MySQL 服务器进程的提示,而 127.0.0.1 强制使用 TCP 连接。有时 UNIX 套接字处于意外位置,或者根本无法访问,这将导致“文件未找到”错误。
套接字通常类似于 /tmp/mysql.sock,或者根据您的发行版和自定义程度可能在其他位置。
请记住,通过 UNIX 套接字(根据定义本地服务器)和 TCP 访问受到两个不同规则的控制。GRANT 中的 localhost 是指 UNIX 套接字。% 或某些特定主机名是指远程访问 via TCP。

这个声明有任何参考资料吗? - Reorx

0
这个问题的答案是,在位于my.cnf中。
/etc/mysql/my.cnf

the line was either

bind-address = 127.0.0.1 

or

bind-address = localhost 

它应该是这样的

bind-address = 0.0.0.0

这将允许所有连接。


13
新手注意!这个答案会让你的网站容易被攻击。最好将连接设置为127.0.0.1,并要求经过授权的用户通过SSH连接。 - pgee70
@pgee70 完全同意!如果您这样做,请确保禁止从外部访问TCP端口3306! - Aleksandar Pavić
3
将所有网络接口(包括公共接口)的Downvote设置为0.0.0.0,因此易受攻击。 - bastien
同意,附加广播IP并不可靠,因为任何IP都可以访问您的服务器。 - Eric Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接