MeWrite Docs

PDOException: SQLSTATE connection refused

PHPでデータベース接続に失敗した場合のエラー

概要

PHPのPDOでデータベースに接続できない場合に発生する例外です。

エラーメッセージ

PDOException: SQLSTATE[HY000] [2002] Connection refused

または

PDOException: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost'

原因

  1. データベースサーバーが起動していない: MySQLやPostgreSQLが停止している
  2. 接続情報が間違っている: ホスト名、ポート、認証情報のミス
  3. ファイアウォールでブロック: ポートが開いていない
  4. ソケットファイルの問題: Unixソケットが見つからない

解決策

1. データベースサーバーの起動確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# MySQL
sudo systemctl status mysql
sudo systemctl start mysql

# PostgreSQL
sudo systemctl status postgresql
sudo systemctl start postgresql

# Docker
docker ps
docker start mysql-container

2. 接続情報の確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$dsn = 'mysql:host=localhost;port=3306;dbname=myapp;charset=utf8mb4';
$username = 'root';
$password = 'password';

try {
    $pdo = new PDO($dsn, $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
} catch (PDOException $e) {
    echo "接続エラー: " . $e->getMessage();
}

3. 127.0.0.1 を使用(localhost の代わりに)

1
2
// localhostはソケット接続を試みる場合がある
$dsn = 'mysql:host=127.0.0.1;dbname=myapp';

4. ソケットを明示的に指定

1
$dsn = 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=myapp';

5. ユーザー権限の確認

1
2
3
4
5
6
7
-- MySQLでユーザー権限を確認
SHOW GRANTS FOR 'username'@'localhost';

-- ユーザーを作成/権限付与
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON myapp.* TO 'username'@'localhost';
FLUSH PRIVILEGES;

6. Docker環境での接続

1
2
// Docker Composeの場合、サービス名を使用
$dsn = 'mysql:host=mysql;dbname=myapp';  // mysqlはサービス名

7. .env ファイルの確認(Laravel)

1
2
3
4
5
6
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret

よくある間違い

  • ローカル開発とDocker環境でホスト名が異なる
  • ポート番号のデフォルト値を確認していない(MySQL: 3306, PostgreSQL: 5432)
  • パスワードに特殊文字が含まれている場合のエスケープ

PHP の他のエラー

最終更新: 2025-12-09