当我尝试使用php mysqli类连接到mysql数据库时,出现此错误。使用以下代码:
$db = new MySQLi("localhost","kamil","*****"); if (mysqli_connect_errno()) { echo "An error occured. Please try again later."; exit(); }
为了安全起见,密码为*。
我创建kamil了对外部IP地址和本地主机具有所有特权的用户。当我运行时:select user,host from mysql.user它会正确显示这两个用户。
kamil
select user,host from mysql.user
我进行了一些研究,并使用此基准测试:https : //stackoverflow.com/a/2183134/1839439来查看它所连接的内容。事实证明它是唯一能够连接到127.0.0.1和127.0.0.1:3306其为localhost,但是当我提供localhost它抛出了这个错误。
127.0.0.1
127.0.0.1:3306
localhost
我的问题是为什么它只允许我使用本地主机ip地址而不是名称或外部ip连接到数据库。如果要在网站上使用mysql还是可以使用mysql,是否需要其他主机127.0.0.1?
编辑: hosts文件
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无法用于建立连接,可能是因为该套接字不存在(错误编号2)。
MySQL
从MySQL文档:
在Unix上,MySQL程序特别对待主机名localhost,与其他基于网络的程序相比,它可能与您期望的不同。为了连接到本地主机,MySQL程序尝试使用Unix套接字文件连接到本地服务器。即使给 –port或-P选项指定端口号,也会发生这种情况。为确保客户端与本地服务器建立TCP / IP连接,请使用–host或- h指定主机名值127.0.0.1,或本地服务器的IP地址或名称。您也可以使用–protocol = TCP选项来显式指定连接协议,即使是本地主机也是如此。
有几种方法可以解决此问题。
php.ini
my.cnf
mysqli.default_socket
/var/run/mysqld/mysqld.sock
$db = new MySQLi('localhost', 'kamil', '***', '', 0, '/var/run/mysqld/mysqld.sock')