先日、「サーバーを新しくしたらプログラムが動かない」というので、見に行ったのですがハマりました。

どこかで購入(?)したシステムをインストールしたらしいのですが、データベースの接続時に、

 SQLSTATE[42000] [1044] Access denied for user 'ユーザー名'@'localhost

というエラーが出ていました。
SQLSTATE[42000] [1044] は、指定されたユーザーのアクセスを拒否する というエラーです。


状況としては、
●システムのインストールは成功している
●データベースは作ってある
●phpMyAdmin にはログインできる
●ユーザー名やパスワードは間違っていない


エラーメッセージからすると、ユーザー名やパスワードが間違っているのかと、いろいろ試したのですが状況は変わらず。

再度、サーバーの設定を確認していたら、データベースのポート番号が '3307' になっていました!
なぜそうなっていたのかはわかりませんが、localhost は '3306' なので、明示的に指定しなければつながりません。
が、そもそもポート番号を指定するところが無い!?


インストールしたシステムが php で作られていたので、ソースを覗いてみたら、データベースに接続する部分が、以下のようになっていました。

$this->pdo = new PDO(
sprintf('mysql:dbname=%s;host=%s;charset=utf8',
DB_NAME,
DB_HOST
),
・・・


なので、ポート番号を指定するように書き換えました。

$this->pdo = new PDO(
sprintf('mysql:dbname=%s;host=%s;port=%s;charset=utf8',
DB_NAME,
DB_HOST,
DB_PORT
),
・・・


これで、
 DB_HOST に、データベースのIPアドレス(localhost ではない)
 DB_PORT に、データベースのポート番号('3307')
を指定することで、解決しました。



今回ハマった原因は、データベースのポート番号は '3306' だと思い込んでいたこと。
プログラムにポート番号を指定する箇所が無かったため、なかなか気づきませんでした。

「これはハマるだろうなぁ」
と思ったので、記事にしてみました。