当我尝试使用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
时,它会抛出此错误。
我的问题是为什么它只允许我使用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 |
答案 0 :(得分:69)
当您只使用“localhost”时,MySQL客户端库会尝试使用Unix域套接字进行连接而不是TCP / IP连接。该错误告诉您,名为MySQL
的套接字不能用于建立连接,可能是因为它不存在(错误号2)。
在Unix上,MySQL程序专门处理主机名localhost 与其他人相比可能与您的期望不同的方式 基于网络的程序。用于连接到localhost,MySQL程序 尝试使用Unix套接字文件连接到本地服务器。 即使给出了--port或-P选项来指定端口,也会发生这种情况 数。确保客户端建立TCP / IP连接 本地服务器,使用--host或-h指定主机名值 127.0.0.1,或本地服务器的IP地址或名称。您还可以显式指定连接协议,即使对于localhost也是如此 使用--protocol = TCP选项。
有几种方法可以解决这个问题。
127.0.0.1
而不是localhost
来执行此操作。但是,Unix套接字可能更快,更安全。php.ini
中更改套接字:打开MySQL配置文件my.cnf
以查找MySQL创建套接字的位置,并将PHP的mysqli.default_socket
设置为该路径。在我的系统上,它是/var/run/mysqld/mysqld.sock
。打开连接时,直接在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”的用户权限,并使用%,因为它是通用主机名的通配符。