PDOでSQLSTATE[HY000] [2002] Connection refusedになるとき

Apache PHP

PHPでMySQLを使うときはPDOを使いますね。先日、PDOで接続しようとしたところ、MySQLからエラーがでてしまいました。PHPの文法的な問題ではなかったので、解決方法を残します。

原因とそのコード

原因を一言で説明すると、

「接続するときの文字コードがMySQLと一致しなかった」

です。普通は何もしなくても、UTF-8が多いのでエラーはでないのではないでしょうか。そもそも今回接続しようとしたサーバーが海外だったからかなと思っています。エラーを出したコードが以下になります。

try {
  $db = new PDO("mysql:host=localhost,dbname=test","test","12345678");
} catch (PDOException $e) {
  print 'Error: ' . $e->getMessage() . '<br />';
  exit;
}

確かに普通に接続できるコードに見えますが、何度実行しても、

Connection Refused

文字コードの変更、BOMの有無、パーミッション、ポートの明示、などなど色々試したけど、どれも駄目。

ということで、思い切ってPDOについて調べたところ、UTF-8ではデータベースに接続する際の文字コードを指定する必要があるとのこと。以下のPHP公式マニュアルを参考に追記します。

PHP: 接続、および接続の管理

文字コードを指定したPDO

UTF-8で接続してね、と指示します。charset=utf-8が追記した部分です。

try {
    $db = new PDO('mysql:host=localhost;dbname=test;charset=utf8','test','12345678');
} catch (PDOException $e) {
    print 'Error!: ' . $e->getMessage() . '<br />';
    exit;
}

本当に文字コードが原因なら、これで治るはずです。

文字コードを指定しても治らないときは

文字コードを指定したけど治らなかった、とか別のエラーがでたというのは当然あり得ることです。実行環境が違えば、出るエラーの原因も様々ですから。そういうときは、以下の点に気をつけてみて下さい。

  • MySQLのポート番号は3306(デフォルト)ですか?独自のポート番号を使っていませんか?
  • MySQLサーバーにアクセス権がありますか?例えば、レンタルサーバーの場合、同一サービス内のみアクセスできる場合があります。
  • PDOとMySQLの互換性はありますか?推奨バージョンを使っていますか?

まとめ

  • PHPとMySQLの文字コードを合わせる
  • PHPの基礎的な文法ミスにも注意
  • 特に、海外サーバーは注意