【问题标题】:Error 2002 Connection refused on PHP connecting to MySQL running on MAMP错误 2002 连接在 PHP 连接到 MAMP 上运行的 MySQL 时被拒绝
【发布时间】:2021-06-30 20:23:06
【问题描述】:

在安装 ddev、Docker 和 MAMP 之后,我刚刚在本地 Mac 上安装了 Laravel。我使用了https://ddev.readthedocs.io/en/stable/users/cli-usage/#laravel-quickstart 指南,一切看起来都不错。但是,当我尝试运行从 Internet 下载的示例代码时,我开始收到错误消息

Illuminate \ Database \ QueryException (2002)

SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from `users` where `email` = frankie@example.com limit 1)

一开始,我认为这与内部 Lavavel 错误有关,因为我看到电子邮件地址没有任何引号。但是,我尝试从我从 MAMP 获取的这个 PHP 脚本连接到 MySQL(通过网络连接到 MySQL 部分)

<?php
  $db_host = 'localhost';
  $db_user = 'root';
  $db_password = 'root';
  $db_db = 'information_schema';
  $db_port = 8889;

  $mysqli = new mysqli(
    $db_host,
    $db_user,
    $db_password,
    $db_db
  );
    
  if ($mysqli->connect_error) {
    echo 'Errno: '.$mysqli->connect_errno;
    echo '<br>';
    echo 'Error: '.$mysqli->connect_error;
    exit();
  }

  echo 'Success: A proper connection to MySQL was made.';
  echo '<br>';
  echo 'Host information: '.$mysqli->host_info;
  echo '<br>';
  echo 'Protocol version: '.$mysqli->protocol_version;

  $mysqli->close();
?>

当我意识到我无法从 MAMP (MySQL 5.7.32) 上运行的任何 PHP 脚本/代码连接到 MySQL 时。这是我得到的错误:

Errno: 2002
Error: No such file or directory

然后在阅读了此处的其他类似问题后,我将 localhost 更改为 127.0.0.1 并收到了这条新消息

Errno: 2002
Error: Connection refused

注意事项: MySQL 正在监听端口 8889

文件/Applications/MAMP/tmp/mysql/mysql.sock存在

用户名和密码正确

数据库也存在

我的第一个想法是电子邮件地址缺少引号,这就是我在SQL/Laravel is not quoting text fields when building a query 写下我最初的问题的原因。然而,真正的问题是关于尝试连接到 MySQL 服务器

【问题讨论】:

标签: php mysql laravel mysqli


【解决方案1】:

问题在于您没有将端口作为第五个参数传递给 mysqli 连接。 如果您使用localhost 作为您的主机,则端口参数将被忽略。这就是为什么在 MAMP sn-p 中,它们没有将 $db_port 作为参数传递,根本不需要它。发生这种情况的原因是localhost 不使用 TCP/IP,而是使用 unix 套接字。

在你听从了别人的建议之后,你可能已经把代码改成了原来的样子

$db_host = '127.0.0.1';

这没问题,但由于您不再使用 unix 套接字 (localhost),因此需要端口参数才能建立连接。 如果您没有指定任何其他作为第五个参数,Mysqli 使用3306 端口作为默认端口。这就是您尝试使用该代码连接的端口。 这就是Error: Connection refused 的来源。

要解决此问题,您只需将端口作为第五个参数传递,如下所示:

$mysqli = new mysqli($db_host,$db_user,$db_password,$db_db,$db_port);

sn-p 本身很棒,只是不能完全满足您的需求,您必须对其进行一些调整。 如果您想使用 sn-ps,您必须了解它们的作用以及在这种情况下 mysqli 是如何工作的。确保将来记住这一点,因为它肯定会避免你遇到像这样的不愉快的情况和错误。

【讨论】:

    【解决方案2】:

    在切换到带有 m1 芯片的新 macbook 后,我遇到了类似的问题。 在我的特殊情况下,我在 docker 容器中使用 nginx + php,但 MySQL 安装在主机上(由于 M1 芯片的 MySQL 还没有官方 docker 映像)。

    在我的应用程序配置中,我有以下设置:

    host: localhost (or 127.0.0.1)
    port: 3306
    user: root
    password: mypassword
    

    再一次,在我的特殊情况下,应用程序无法访问 mysql 服务器,因为 PHP 在 docker 容器中运行,并且因为我使用 localhost 作为主机,它是 PHP 容器中的 localhost,其中未安装 mysql 服务器.

    为了解决我的问题,我将配置更改为:

    host: host.docker.internal
    port: 3306
    user: root
    password: mypassword
    

    在问题作者的情况下,解决方案是更改配置:

    host: db
    port: 3306
    database: db
    user: db
    password: db
    

    所以主机/数据库/数据库用户/数据库密码 - 应该设置为db,正如这里的文档中所说的https://ddev.readthedocs.io/en/stable/users/cli-usage/#laravel-quickstart

    如果您通过 docker-compose 使用带有 mysql + php + nginx 的自己的 docker 环境,可能会发生类似的问题。然后,如果你让我们在你的 docker-compose.yml 文件中有这样的东西:

    mysql:
        image: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: example
    

    然后在您的应用程序配置中,您应该使用以下设置来访问 mysql 服务器:

    host: mysql
    port: 3306
    user: root
    password: example
    

    所以,mysql 作为主机,因为 docker-compose.yml 文件中 mysql 的“服务”名称设置为 mysql

    【讨论】:

      【解决方案3】:

      电子邮件必须使用撇号,请参阅When to use single quotes, double quotes, and backticks in MySQL

      喜欢

      select * from `users` where `email` = 'frankie@example.com' limit 1
      

      我也希望你其余的代码使用带参数的预处理语句来防止sql注入

      您的连接也必须通过添加端口信息来更改

      $mysqli = 新的 mysqli( $db_host, $db_user, $db_password, $db_db, ,$db_port );

      因为你不使用标准端口 3306 端口而是 8889

      【讨论】:

      • 我也是这么想的,这就是我写第一个问题stackoverflow.com/questions/66938556/…的原因。然而,它不是关于那个。问题是关于@nbk 的连接。这是我下载的一个demo,我没有写或修改任何一行代码
      • 错误信息很清楚,连接问题是 sysnax 问题。对于连接看看你是否可以连接vioa phpmyasdmn 或mysql 客户端。更改为 127.0.0.1 仅强制 mysql co9nnctor 使用 tcpip 而不是套接字,但我认为您仍然存在服务器未运行的问题,因为套接字应该可以工作。所以查看mysql的错误日志
      • 请分享更多细节。如果连接到服务器已经失败,这如何解决问题?
      • @NicoHaase 请打开你自己的问题,提供所有必要的数据,错误信息你正在使用什么系统和mysql配置,必须有很多信息,以帮助解决这些问题
      • 我没有任何问题。我只是想了解你的答案
      猜你喜欢
      • 2022-08-02
      • 2021-11-24
      • 1970-01-01
      • 2020-12-06
      • 2018-10-22
      • 2020-04-24
      • 2015-06-06
      相关资源
      最近更新 更多