Docker - 致命错误:未捕获的 PDOException:SQLSTATE[HY000] [2002] var/www/html 中没有这样的文件或目录

问题描述 投票:0回答:1

使用 Docker、PHP、MySQL 和 Apache,我在尝试连接任何需要“database-connection.php”的页面时收到以下错误。

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/html/database-connection.php:22 Stack trace: #0 /var/www/html/index.php(3): require() #1 {main} thrown in /var/www/html/database-connection.php on line 22

22号线

throw new PDOException($e->getMessage(), $e->getCode());
导致了这个问题,因为每当我注释掉这一行时,它就会起作用。当我删除评论时,它又回到给我错误。我尝试了与此错误相关的大多数解决方案,但它不起作用。我错过了什么?

docker-compose.yml

version: "3.9"
services:
  php-apache:
    ports:
      - "80:80"
    build: './build/php'
    volumes:
      - ./app/public:/var/www/html
  mysql:
    image: mysql:latest
    ports:
      - "3306:3306"
    build: './build/mysql'
    environment:
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: "commune"
    volumes:
      - dbData:/var/lib/mysql
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    restart: always
    ports:
      - 8080:80
volumes:
  app:
  dbData:

数据库连接.php

<?php //database-connection.php

$type       = 'mysql';
$server     = 'localhost'; // Must be the service name of the database in `docker-compose.yml`
$db         = 'commune';
$port       = '3306';
$charset    = 'utf8mb4';

$username   = 'root';
$password   = 'password';

$options     = [
    PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES      => false,
];

$dsn = "$type:host=$server;dbname=$db;port=$port;charset=$charset";
try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), $e->getCode());
}

?>

index.php

<?php //index.php
    declare(strict_types = 1);
    require 'database-connection.php';

    echo "Hello, World!";

?>
php mysql docker docker-compose
1个回答
0
投票

在你的 PHP 代码中,你应该有

$server = 'mysql';

如代码注释中所写

// Must be the service name of the database in 
docker-compose.yml`

如果这不能解决问题,您需要共享正在为

php-apache
服务构建的 Dockerfile 的内容。

此外,捕获 PDOException 没有多大意义,而只是抛出另一个 PDOException。无需 try/catch 即可实现相同的目标

© www.soinside.com 2019 - 2024. All rights reserved.