docker-composeで以下のように環境を構築してアプリ開発を進めていました。
version: "3" services: web: build: ./docker/web container_name: web environment: TZ: "Asia/Tokyo" ports: - 80:80 volumes: - ./app:/php-voting-app/app depends_on: - db db: build: ./docker/db platform: linux/x86_64 container_name: db environment: MYSQL_ROOT_PASSWORD: ******** MYSQL_DATABASE: votingapp TZ: "Asia/Tokyo" ports: - 3307:3306 volumes: - app_data:/var/lib/mysql - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf restart: always volumes: app_data: driver: local
前提
以下のコードの部分でDBに接続してindex.phpでDBから取得したデータを出力しようとしたところエラーが発生しました
datasource.php
public function __construct($host = 'localhost', $port = '3307', $dbName = 'votingapp', $username = 'voting_user', $password = ********) { $dsn = "mysql:host={$host};port={$port};dbname={$dbName};"; $this->conn = new PDO($dsn, $username, $password);
index.php
use DB\UserQuery; $result = UserQuery::fetchById('test'); var_dump($result);
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /php-voting-app/app/htdocs/php/db/datasource.php:14 Stack trace: #0 /php-voting-app/app/htdocs/php/db/datasource.php(14): PDO->__construct('mysql:host=loca...', 'voting_user', '*********') #1 /php-voting-app/app/htdocs/php/db/user.query.php(10): db\DataSource->__construct() #2 /php-voting-app/app/htdocs/index.php(14): db\UserQuery::fetchById('test') #3 {main} thrown in /php-voting-app/app/htdocs/php/db/datasource.php on line 14
ご教授の程よろしくお願いします
ご指摘の通り以下のようにtyr catch構文で書き直しました
public function __construct($host = 'localhost', $port = '3307', $dbName = 'votingapp', $username = 'voting_user', $password = 'password') { try { $dsn = "mysql:host={$host};port={$port};dbname={$dbName}"; $this->conn = new PDO($dsn, $username, $password); $this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { echo "データベース接続エラー: " . $e->getMessage(); exit; } }
