当我尝试使用php mysqli类连接到mysql数据库时,出现此错误。使用以下代码:
$db = new MySQLi("localhost","kamil","*****");
字符串
密码为 *,以确保安全。
我已经创建了一个用户kamil
,它拥有外部ip地址和本地主机的所有权限。当我运行: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 |
6条答案
按热度按时间xmd2e60i1#
当你只使用“localhost”时,MySQL客户端库会尝试使用Unix域套接字进行连接,而不是TCP/IP连接。错误是告诉你名为
MySQL
的套接字不能用于连接,可能是因为它不存在(错误2)。MySQL文档:
在Unix上,MySQL程序特别对待主机名localhost,与其他基于网络的程序相比,这种方式可能与您所期望的不同。对于到localhost的连接,MySQL程序试图通过使用Unix套接字文件连接到本地服务器。即使使用--port或-P选项指定端口号,也会发生这种情况。为了确保客户端进行TCP/使用--host或-h指定主机名值127.0.0.1,或者本地服务器的IP地址或名称。您还可以使用--protocol=TCP选项显式指定连接协议,即使是localhost。
有几种方法可以解决这个问题。
1.你可以只使用TCP/IP而不是Unix套接字。你可以在连接时使用
127.0.0.1
而不是localhost
来做到这一点。Unix套接字可能更快,更安全。1.您可以更改
php.ini
中的套接字:打开MySQL配置文件my.cnf
以查找MySQL创建套接字的位置,并将PHP的mysqli.default_socket
设置为该路径。在我的系统中,它是/var/run/mysqld/mysqld.sock
。1.打开连接时直接在PHP脚本中配置套接字。例如:
字符串
h79rfbju2#
如果是PHP的问题,你可以简单地修改配置文件 * php.ini *,无论它位于何处,并更新PORT/SOCKET-PATH等的设置,使其连接到服务器。
在我的例子中,我打开文件php.ini,
字符串
我必须承认,我从@Joni的公认答案中得到了暗示
3vpjnl9f3#
如果“localhost”不工作,但127.0.0.1可以。请确保您的本地主机文件指向正确的位置。(对于Linux/mac,为/etc/hosts;对于windows,为C:\Windows\System32\drivers\etc\hosts)。
此外,确保您的用户可以连接到您试图选择的任何数据库。
cgfeq70w4#
我的问题是为什么它只允许我使用localhost ip地址连接到数据库,而不是名称或外部ip。
根据
mysqli_connect()
的文档:主要参数:主机名:可以是主机名或IP地址。当将null值或字符串“
localhost
“传递给此参数时,假定为本地主机。如果可能,将使用管道而不是TCP/IP协议。如果同时提供主机名和端口号(例如localhost:3308
),则使用TCP/IP协议。因此,基本上,如果您指定
localhost
或null
值,它将强制执行命名管道/套接字连接(参见:mysqli.default_socket
),否则(例如,当您指定端口或非本地主机时)它将使用TCP/IP协议(例如localhost:3308
)。xtfmy6hx5#
请检查以下文件
字符串
将主机名与ip绑定的行可能缺少将它们绑定到一起的行
型
如果给定的行丢失。请在文件中添加该行
你也可以检查你的MySQL数据库的用户表,并告诉我们你正在使用的用户的主机列值。你应该对主机“127.0.0.1“和“localhost”都有用户权限,并使用%,因为它是通用主机名的野生字符。
9jyewag06#
我也遇到了这个错误问题,我找到了这个简单的解决方案:
1.去wamp
1.右键单击wamp
1.工具
1.修改mysql使用的端口
1.(点击:使用3306以外的端口)
然后再放一个,例如:3308
默认情况下,通常为3306