質問: new PDO($dsn,$user,$pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); } ?> ``` ##### 上記コードを実行すると以下、画面に表示されます。 array(1) { [0]=> string(29) "Host key verification failed." } int(255) データベース接続失敗。SQLSTATE[HY000] [2002] Connection refused ##### 教えていただきたいこと(わからないこと) * execコマンドの第3引数で成功したかどうかわかるとのことで表示してみたら255と返ってきましたが、PHP初心者のため、何が原因で失敗しているのか、この先何を試したらよいか分かりません。。。 * その他、どうすればSSH経由でMySQLに接続できるか教えていただきたく。 ##### 補足 * 当方手元のPCはwindowsです。TeraTermからSSHポートフォワーディングを行い、ODBC接続でMySQLに接続できることは確認しています。(ので、コマンドの接続情報やポート番号等は間違いありません。) * MySQLのユーザの認証方法は「mysql_native_password」です。 よろしくお願いいたします。
回答: まず、手動で下記のsshコマンドが動くかどうかを確認しましょう。 ``` $ ssh -f -N -L 19000:server.ne.jp:3306 root@server.ne.jp -i ./key/id_rsa ``` ここで、19000:server.ne.jp:3306 に書かれているホスト名(server.ne.jp)は、ssh接続した端末(サーバー)から見てのホスト名です。上記の記述だと同じホスト名になっているので、以下のように書くこともできます。 ``` $ ssh -f -N -L 19000:localhost:3306 root@server.ne.jp -i ./key/id_rsa ``` また、root@server.ne.jp となっているのは、rootでssh接続することになりますが、ssh側でrootログインの許可は与えていますか? セキュリティ上の理由で、多くの場合、rootではsshログインできなくなっています。この点も確認してください。 また、以下のDSNですが、以下は間違いです。 ``` $dsn = 'mysql:dbname=mydb;host=server.ne.jp;charset=utf8mb4'; ``` おそらく以下のようにすべきです。参照元の記事もそうなっています(ポート番号等は違いますが)。 ``` $dsn = 'mysql:dbname=db;host=127.0.0.1;port=19000;charset=utf8mb4'; ``` こちらも、事前に、以下のようにmysqlコマンドで接続を確認しておくとよいでしょう。 ``` $ mysql -u root -h 127.0.0.1 -P 19000 -p ``` 初心者の方ほど事前確認を怠りがちですが、段階的に確認していかないとうまくはいきません。難易度の高いことを試す場合はなおさらです。