【问题标题】:Warning: mysqli_connect(): (HY000/2002): No such file or directory警告:mysqli_connect(): (HY000/2002): 没有这样的文件或目录
【发布时间】: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 失败:没有这样的文件或目录

知道我哪里出错了吗?

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    在主机中设置端口:

    $con = mysqli_connect("localhost:**3306**","vanilla_user3","vanilla_password","vanilla");
    

    【讨论】:

      【解决方案2】:

      好的,我刚刚找到了解决方案。问题原来是主机不应该是localhost,而是127.0.0.1。我一直以为localhost127.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:8889localhost:{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 用户的说明进行操作 stackoverflow.com/questions/4219970/…
          猜你喜欢
          • 2019-07-27
          • 2017-06-12
          • 2019-05-08
          • 2020-05-07
          相关资源
          最近更新 更多