警告:mysqli_connect(): (HY000/2002): 没有这样的文件或目录
Posted
技术标签:
【中文标题】警告:mysqli_connect(): (HY000/2002): 没有这样的文件或目录【英文标题】:Warning: mysqli_connect(): (HY000/2002): No such file or directory 【发布时间】:2021-01-09 03:44:33 【问题描述】:我正在尝试在我的 Mac 上安装 vanilla 论坛,为此我刚刚从 mysql 命令行创建了一个数据库和一个用户:
mysql> CREATE DATABASE vanilla;
Query OK, 1 row affected (0.00 sec)
mysql> create user 'vanilla_user3'@'localhost' IDENTIFIED BY 'vanilla_password';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON * . * TO 'vanilla_user3'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
所以我尝试使用以下代码进行连接:
$con=mysqli_connect("localhost","vanilla_user3","vanilla_password","vanilla");
if (mysqli_connect_errno($con))
echo "Failed to connect to MySQL: " . mysqli_connect_error();
但不幸的是,我收到一条错误消息
警告:mysqli_connect(): (HY000/2002): No such file or directory in /Users/kramer65/Sites/vanilla/info.php on line 3 连接 MySQL 失败:没有这样的文件或目录
知道我哪里出错了吗?
【问题讨论】:
【参考方案1】:在主机中设置端口:
$con = mysqli_connect("localhost:**3306**","vanilla_user3","vanilla_password","vanilla");
【讨论】:
【参考方案2】:好的,我刚刚找到了解决方案。问题原来是主机不应该是localhost
,而是127.0.0.1
。我一直以为localhost
和127.0.0.1
是一样的,结果却不一样。
所以也许作为对未来用户的提示,当有疑问时,请始终使用该 ip。
【讨论】:
mohitmayank 的回答是正确的。如果localhost
不起作用,你需要告诉 PHP 在哪里可以找到你的 mysql 套接字文件。
查看我对#Adam 2016 年 11 月 21 日的回答的评论
类似问题但更简单:MySQL 未启动可能会导致相同的错误。客户的服务器几个月没有重新启动,重新启动后 mysql 没有运行,没有人想检查。太担心所有的代码库和“谁造成了这个错误”。大声笑(仅仅因为 Apache 已经启动并且您可以 ssh 进入服务器,这并不能保证 MySQL 也已启动)
@TheSatinKnight 我每隔几个月也观察到一次同样的错误,这似乎与你所说的有关,因为 MySQL 服务器在那个时候暂时不可用。【参考方案3】:
在/opt/lampp/etc/
中找到php.ini
文件
然后编辑:
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
在此之后,在您的数据库连接文件中从 localhost 更改为 127.0.0.1
。一切都会变好。但是,如果您尝试使用 config.inc.php
文件,请确保将其全部设置为 127.0.0.1
,而不是 localhost。
【讨论】:
【参考方案4】:如果使用 docker,则使用 mysql 容器名称作为 mysql 的主机名。例如,如果这是 docker compose 文件:
mysqldb:
image: mysql:5.7.22
container_name: mysqlHost
ports:
- "33099:3306"
主机名是mysqlHost
,端口是3306
,而不是33099
!
如果您不使用 docker compose,docker ps
会显示正在运行的容器名称。
【讨论】:
【参考方案5】:假设您的 MAMP MySQL 端口默认设置为 8889。有时仅localhost
是不够的,在这种情况下,您还必须将 MySQL 端口也放在那里,所以您可以使用localhost:8889
或localhost:whatever your MySQL port number is
。我还是 MySQL 的新手,所以我不知道原因,但对于最近收到消息的任何人来说:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in ...
将 MySQL 端口号添加到 localhost 对我来说是解决方法。
【讨论】:
在我认为是一个错误的情况下,localhost 确实需要在 $host 参数中添加端口(即使它是默认值 3306),但没有其他主机名。因此,您将使用“localhost:3306”作为 $host 参数。其他主机名和 IP 地址将使用 $port 参数。但是如果 $host 是 'localhost',$port 参数将被忽略。我相信问题可以追溯到 __construct() 的 PHPdoc 中的某些内容:“如果可能,将使用管道而不是 TCP/IP 协议”。【参考方案6】:我遇到了同样的问题,但问题与 php.ini
文件有关。
我必须在/etc/php.ini
(或您的php.ini
所在的任何位置)中编辑这两行:
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
重新启动 apache 服务器以确保反映更改。
sudo apachectl restart
【讨论】:
这是使用套接字代替 TCP/IP 的正确答案。 mysql.sock 对我来说位于 /var/run/mysqld/mysqld.sock' 按照此处针对 Mac 用户的说明进行操作 ***.com/questions/4219970/…以上是关于警告:mysqli_connect(): (HY000/2002): 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章
警告:mysqli_connect():MySQL 服务器已消失
警告:mysqli_connect():(HY000/1045):用户'record'@'localhost'的访问被拒绝(使用密码:YES)[重复]
警告:mysqli_connect(): (HY000/2002): 没有这样的文件或目录
警告:mysqli_connect(): (HY000/1049): 仅在 mac 终端中的未知数据库