mysqli :: mysqli():( HY000 / 2002):无法通过套接字'MySQL'连接到本地MySQL服务器(2)

时间:2012-12-07 19:09:35

标签: php mysql

当我尝试使用php mysqli类连接到mysql数据库时出现此错误。使用以下代码:

$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
    echo "An error occured. Please try again later.";
    exit();
}

密码为*表示安全。

我创建了用户kamil,其中包含外部IP地址和localhost的所有权限。当我运行:select user,host from mysql.user时,它会正确显示这两个用户。

我做了一些研究并使用了这个基准:https://stackoverflow.com/a/2183134/1839439来查看它连接的内容。事实证明它只能连接到127.0.0.1127.0.0.1:3306这是localhost,但是当我提供localhost时,它会抛出此错误。

我的问题是为什么它只允许我使用localhost ip地址而不是名称或外部ip连接到数据库。如果我想在网站上使用mysql或者我可以使用127.0.0.1,我是否需要不同的主机?

修改
hosts档案

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi

<小时/> 该用户的Mysql用户表结果:

| kamil            | 109.255.177.28 |
| kamil            | localhost      |

4 个答案:

答案 0 :(得分:69)

当您只使用“localhost”时,MySQL客户端库会尝试使用Unix域套接字进行连接而不是TCP / IP连接。该错误告诉您,名为MySQL的套接字不能用于建立连接,可能是因为它不存在(错误号2)。

来自MySQL Documentation

  

在Unix上,MySQL程序专门处理主机名localhost   与其他人相比可能与您的期望不同的方式   基于网络的程序。用于连接到localhost,MySQL程序   尝试使用Unix套接字文件连接到本地服务器。   即使给出了--port或-P选项来指定端口,也会发生这种情况   数。确保客户端建立TCP / IP连接   本地服务器,使用--host或-h指定主机名值   127.0.0.1,或本地服务器的IP地址或名称。您还可以显式指定连接协议,即使对于localhost也是如此   使用--protocol = TCP选项。

有几种方法可以解决这个问题。

  1. 您可以使用TCP / IP而不是Unix套接字。您可以在连接时使用127.0.0.1而不是localhost来执行此操作。但是,Unix套接字可能更快,更安全。
  2. 您可以在php.ini中更改套接字:打开MySQL配置文件my.cnf以查找MySQL创建套接字的位置,并将PHP的mysqli.default_socket设置为该路径。在我的系统上,它是/var/run/mysqld/mysqld.sock
  3. 打开连接时,直接在PHP脚本中配置套接字。例如:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    

答案 1 :(得分:3)

如果这是一个PHP问题,您只需更改配置文件 php.ini ,无论它位于何处,并更新PORT / SOCKET-PATH等设置,使其连接到服务器。

在我的情况下,我打开文件php.ini并做了

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

它立即起作用。我不得不承认,我接受了@Joni

接受的回答

答案 2 :(得分:0)

如果'localhost'不起作用,但127.0.0.1不起作用。确保您的本地主机文件指向正确的位置。 (/ etc / hosts用于linux / mac,C:\ Windows \ System32 \ drivers \ etc \ hosts用于windows)。

此外,请确保允许您的用户连接到您尝试选择的任何数据库。

答案 3 :(得分:0)

请检查以下文件

%SystemRoot%\system32\drivers\etc\host

将主机名与ip绑定的行可能缺少将它们绑定到togather

的行
127.0.0.1  localhost

如果缺少给定的行。在文件中添加行


您是否还可以检查MySQL数据库的用户表,并告诉我们您正在使用的用户的主机列值。您应该拥有主机“127.0.0.1”和“localhost”的用户权限,并使用%,因为它是通用主机名的通配符。