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

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

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

为了安全,密码是*。

我已创build用户kamil具有外部IP地址和本地主机的所有权限。 当我运行: select user,host from mysql.user它正确显示这两个用户。

我做了一些研究,并使用这个基准: https : //stackoverflow.com/a/2183134/1839439看看它连接到什么。 事实certificate,它只能连接到127.0.0.1127.0.0.1:3306这是本地主机,但是当我提供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 | 

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

从MySQL文档 :

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

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

  1. 你可以使用TCP / IP而不是Unix套接字。 连接时,您可以使用127.0.0.1而不是localhost 。 尽pipe如此,Unix套接字可能更快,更安全。
  2. 您可以在php.ini更改套接字:打开MySQLconfiguration文件my.cnf以查找MySQL创build套接字的位置,并将PHP的mysqli.default_socket设置为该path。 在我的系统上是/var/run/mysqld/mysqld.sock
  3. 打开连接时直接在PHP脚本中configuration套接字。 例如:

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

如果是PHP问题,可以简单地将configuration文件php.ini改为所在位置,并更新PORT / SOCKET-PATH等设置,使其连接到服务器。

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

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

它马上就起作用了。 我不得不承认,我从@Joni接受的答案中得到了暗示

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

另外,请确保您的用户被允许连接到您尝试select的任何数据库。

请检查以下文件

 %SystemRoot%\system32\drivers\etc\host 

用ip绑定主机名的那一行可能会丢失一行将它们绑定到一起的行

 127.0.0.1 localhost 

如果给定的行丢失。 在文件中添加行


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

[已解决]:我们整合的解决scheme是,我们增加了服务器空间,并且已经解决了。

不知道确切的原因,但我们的方式得到解决。