php mysqli::mysqli():(HY 000/2002):无法通过套接字'MySQL'连接到本地MySQL服务器(2)

uyto3xhc  于 12个月前  发布在  PHP
关注(0)|答案(6)|浏览(186)

当我尝试使用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.1127.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      |
xmd2e60i

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

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

字符串

h79rfbju

h79rfbju2#

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

3vpjnl9f

3vpjnl9f3#

如果“localhost”不工作,但127.0.0.1可以。请确保您的本地主机文件指向正确的位置。(对于Linux/mac,为/etc/hosts;对于windows,为C:\Windows\System32\drivers\etc\hosts)。
此外,确保您的用户可以连接到您试图选择的任何数据库。

cgfeq70w

cgfeq70w4#

我的问题是为什么它只允许我使用localhost ip地址连接到数据库,而不是名称或外部ip。
根据mysqli_connect()的文档:
主要参数:主机名:可以是主机名或IP地址。当将null值或字符串“localhost“传递给此参数时,假定为本地主机。如果可能,将使用管道而不是TCP/IP协议。如果同时提供主机名和端口号(例如localhost:3308),则使用TCP/IP协议。
因此,基本上,如果您指定localhostnull值,它将强制执行命名管道/套接字连接(参见:mysqli.default_socket),否则(例如,当您指定端口或非本地主机时)它将使用TCP/IP协议(例如localhost:3308)。

xtfmy6hx

xtfmy6hx5#

请检查以下文件

%SystemRoot%\system32\drivers\etc\host

字符串
将主机名与ip绑定的行可能缺少将它们绑定到一起的行

127.0.0.1  localhost


如果给定的行丢失。请在文件中添加该行
你也可以检查你的MySQL数据库的用户表,并告诉我们你正在使用的用户的主机列值。你应该对主机“127.0.0.1“和“localhost”都有用户权限,并使用%,因为它是通用主机名的野生字符。

9jyewag0

9jyewag06#

我也遇到了这个错误问题,我找到了这个简单的解决方案:
1.去wamp
1.右键单击wamp
1.工具
1.修改mysql使用的端口
1.(点击:使用3306以外的端口)
然后再放一个,例如:3308
默认情况下,通常为3306

相关问题