Php 错误:SQLSTATE[HY000][2002]没有这样的文件或目录

Php 错误:SQLSTATE[HY000][2002]没有这样的文件或目录,php,mysql,Php,Mysql,我知道这类问题可能被问过好几次,但它们都与laravel有关,在我的例子中,这是没有框架的香草php 我有一个表单,它可以从用户那里收集表单,并将其保存到数据库中,但我一直收到关于MYSQL的错误错误:SQLSTATE[HY000][2002]没有这样的文件或目录。以下是我的数据库配置文件和包含它的文件: //数据库配置 是的,我知道处理表单的脚本不安全 另外,当我访问该页面时,我会遇到以下错误 Fatal error: Uncaught PDOException: SQLSTATE[HY

我知道这类问题可能被问过好几次,但它们都与laravel有关,在我的例子中,这是没有框架的香草php

我有一个表单,它可以从用户那里收集表单,并将其保存到数据库中,但我一直收到关于MYSQL的错误
错误:SQLSTATE[HY000][2002]没有这样的文件或目录
。以下是我的数据库配置文件和包含它的文件:

//数据库配置

是的,我知道处理表单的脚本不安全

另外,当我访问该页面时,我会遇到以下错误

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/html/library/Database.php:19 Stack trace: #0 /var/www/html/index.php(2): require() #1 {main} thrown in /var/www/html/library/Database.php on line 19
如果需要,这就是我使用的sql

如果不存在成员,则创建表(
成员id INT自动递增非空主键,
first_name VARCHAR(255)不为空,
姓氏VARCHAR(255)不为空,
电子邮件VARCHAR(255)不为空且唯一,
参考代码INT不为空
);
整个项目也在docker容器中,下面是
docker compose.yml
文件

version: '3.7'

services:
  php:
    container_name: nairobi_php
    build:
      context: ./
    volumes:
      - './src:/var/www/html'
    depends_on:
      - mysql
    ports:
      - 80:80

  mysql:
    container_name: nairobi_mysql
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
      MYSQL_DATABASE: nairobi
      MYSQL_USER: admin
      MYSQL_PASSWORD: 123456
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080


首先,像这样更改您的连接:用以下代码替换Database.php中的代码,并阅读代码中的注释

$host = 'localhost';
$db   = 'nairobi';
$user = 'admin';
$pass = '123456';
$charset = 'utf8mb4'; // Always set charset for database
$port = '3308'; //Your port can be 3306 or 3307

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $dbh = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
现在你的密码!您正在使用prepare语句,这使您的代码足够安全。 检查
Database.php
文件的url是否正确,并将您的更改为

require_once "./library/Database.php";
    if (isset($_POST['submit'])) {

      $first_name = $_POST['first_name'];
      $last_name = $_POST['last_name'];
      $email = $_POST['email'];
      $reference_code = $_POST['reference_code'];
    //You have a `TABLE` name call members so you dont need `TABLE` its causing problem
    //Your query should look like this
      $sql = 'INSERT INTO members (first_name, last_name, email, reference_code) VALUES (:first_name, :last_name, :email, :reference_code)';
      $stmt = $dbh->prepare($sql);
      $stmt->execute([$first_name, $last_name, $email, $reference_code]);
    //I removed array here which you dont need, you can directly add fields in execute.
      $stmt->closeCursor();
    //Use `closeCursor()` to free your connection instead unset or close.
    }
决赛 确保您创建了一个数据库。 确保在数据库中创建了表调用成员

如果您已经完成了所有这些,那么您的代码将毫无问题地工作

HTML表单应该是这样的,若你们想上传图片,你们需要在表单中添加多重加密

<form action="yourpage.php" method="post">
  <div class="container">first_name</b></label>
    <input type="text" placeholder="Enter first_name" name="first_name" required>

    <label for="last_name"><b>last_name</b></label>
    <input type="text" placeholder="Enter last_name" name="last_name" required>

    <label for="email"><b>email</b></label>
    <input type="email" placeholder="Enter email" name="email" required>

    <label for="reference_code"><b>reference_code</b></label>
    <input type="text" placeholder="Enter reference_code" name="reference_code" required>

    <button type="submit">Login</button>
  </div>
</form>

我终于解决了问题,谢谢@Dlk的帮助

问题的原因是因为在
database.php
中,我将mysql的主机称为
localhost
,而不是
docker compose.yml
文件中mysql服务的名称。因此,
database.php
文件应该如下所示:


它与我的
docker compose.yml
文件相关

version: '3.7'

services:
  php:
    container_name: nairobi_php
    build:
      context: ./
    volumes:
      - './src:/var/www/html'
    depends_on:
      - mysql
    ports:
      - 80:80

  mysql:
    container_name: nairobi_mysql
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
      MYSQL_DATABASE: nairobi
      MYSQL_USER: admin
      MYSQL_PASSWORD: 123456
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080


谢谢你,伙计,我真的很感谢你的帮助,但现在我又遇到了另一个困难。这是我得到的错误。如果docker containerCheck url中没有添加任何内容,则编辑您的问题并在其底部添加错误。并检查“/library/Database.php”的路径是否正确;是否正确您可以将
localhost
更改为
127.0.0.1
或您的ip(如果您有)。查看与docker的连接是否确定“/library/Database.php”;是否在那个地方存在?您是否用应答中的代码更改了database.php中的代码?你们有并没有确认你们的端口是否如我在回答中提到的那个样正确?您确定database.php中没有其他内容吗?第19行是我的代码中的}这是我的See答案上的源代码的样子我更新了!请你做一个屏幕截图,并在其他地方添加一些。我看不到来自imgur.com的任何内容。这是我网站上源代码的更新链接,很高兴你解决了!我在评论中提到,您可能没有看到您是否可以将localhost更改为127.0.0.1或您的ip(如果您有一个ip->您的服务名称)
version: '3.7'

services:
  php:
    container_name: nairobi_php
    build:
      context: ./
    volumes:
      - './src:/var/www/html'
    depends_on:
      - mysql
    ports:
      - 80:80

  mysql:
    container_name: nairobi_mysql
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: CUeHpADRmZCtnTFGctxp
      MYSQL_DATABASE: nairobi
      MYSQL_USER: admin
      MYSQL_PASSWORD: 123456
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080