PDOでSQLSTATE[HY000] [2002] Connection refusedになるとき
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公式マニュアルを参考に追記します。
文字コードを指定した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の基礎的な文法ミスにも注意
- 特に、海外サーバーは注意