我的数据库用户存在,但我仍然得到(HY000/2002):没有这样的文件或目录

kra*_*r65 29 mysql macos privileges

我正在尝试在我的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)
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用以下代码进行连接:

$con=mysqli_connect("localhost","vanilla_user3","vanilla_password","vanilla");
if (mysqli_connect_errno($con)) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是我得到一个错误说 Warning: mysqli_connect(): (HY000/2002): No such file or directory in /Users/kramer65/Sites/vanilla/info.php on line 3 Failed to connect to MySQL: No such file or directory

知道我哪里错了吗?

kra*_*r65 112

好吧,我刚刚找到了解决方案.问题原来是主持人不应该localhost,但是127.0.0.1.我一直以为localhost127.0.0.1是一样的,但它竟然是不同的.

所以也许作为未来用户的提示,如有疑问,请务必使用ip.

祝大家美好的一天!

  • "金窝银窝不如自己家里的狗窝" (10认同)
  • mohitmayank的答案是正确的.如果`localhost`不起作用,你需要告诉PHP在哪里找到你的mysql套接字文件. (2认同)

moh*_*ank 12

我有同样的问题,但问题是与php.ini文件有关.

我必须在/etc/php.ini(或任何php.ini位置)编辑这两行:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
Run Code Online (Sandbox Code Playgroud)

重新启动Apache服务器以确保反映更改.

sudo apachectl restart
Run Code Online (Sandbox Code Playgroud)

  • 这是使用套接字而不是TCP / IP的正确答案。 (2认同)

hpa*_*nia 12

如果使用 docker,请使用 mysql 容器名称作为 mysql 的主机名。例如,如果这是 docker compose 文件:

mysqldb:
    image: mysql:5.7.22
    container_name: mysqlHost
    ports:
        - "33099:3306"
Run Code Online (Sandbox Code Playgroud)

主机名将是mysqlHost,端口将是3306,而不是33099

如果您不使用 docker compose,docker ps请显示正在运行的容器名称。

另一方面,要从 docker 连接主机上的 mysql 服务器,请连接到host.docker.internal

mysqldb:
    image: mysql:5.7.22
    container_name: mysqlHost
    ports:
        - "33099:3306"
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 6

假设您的MAMP MySQL端口默认设置为8889.有时localhost单独是不够的,在这种情况下你必须把MySQL端口放在那里,所以你会做localhost:8889localhost:{whatever your MySQL port number is}.我还是MySQL的新手,所以我不知道原因,但对于那些最近得到消息的人来说:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in ...将MySQL端口号添加到localhost是我的修复.

  • 在我认为是一个bug,localhost确实需要在$ host参数中添加端口(即使它是缺省值3306),但没有其他主机名.因此,您将使用"localhost:3306"作为$ host参数.其他主机名和IP地址将使用$ port参数.但是如果$ host是'localhost',则会忽略$ port参数.我认为这个问题跟踪了_dconstruct()的PHPdoc中的内容:"如果可能,将使用管道而不是TCP/IP协议". (2认同)