34

当我尝试使用 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.1本地127.0.0.1:3306主机,但是当我提供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

4 回答 4

82

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

来自MySQL 文档

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

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

  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脚本中配置socket。例如:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    
于 2012-12-07T21:24:13.287 回答
5

如果是 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 接受的答案中得到了暗示

于 2017-04-26T07:47:04.410 回答
1

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

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

于 2012-12-07T19:12:50.990 回答
0

请检查以下文件

%SystemRoot%\system32\drivers\etc\host

将主机名与 ip 绑定的行可能缺少将它们绑定在一起的行

127.0.0.1  localhost

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


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

于 2012-12-07T19:20:31.953 回答