使用 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 代码中,你应该有
$server = 'mysql';
如代码注释中所写
// Must be the service name of the database in
docker-compose.yml`
如果这不能解决问题,您需要共享正在为
php-apache
服务构建的 Dockerfile 的内容。
此外,捕获 PDOException 没有多大意义,而只是抛出另一个 PDOException。无需 try/catch 即可实现相同的目标