【解決方法と原因】PHPでConnection failed: SQLSTATE[HY000] [2002] のエラー
「いちばんやさしいPHPの教科書」のテキスト通りに、Chapter4のデータベースに接続しようとしてMySQLに接続できない現象があったのでメモ。
問題の原因は、 MySQLの8888のポートに接続しようとしたが、実際は8889に設定されているので接続できない、ということだった。
いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング (「いちばんやさしい教本」シリーズ)
- 作者: 柏岡秀男,池田友子
- 出版社/メーカー: インプレス
- 発売日: 2015/04/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
エラー箇所はPDOをnewしている行らしいのだが、原因が不明だったため、try catch構文を入れ、エラー原因をgetMessage()で取得した。すると、
エラーコード
Connection failed: SQLSTATE[HY000] [2002]~
どうやらMySQLの接続に失敗しているらしい。
ソースコード
<?php
$user = "●●●";
$pass = "●●●";
$dsn = "mysql:dbname=db1;host=localhost; charset=utf8";
try{
$dbh = new PDO($dsn, $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql="SELECT * FROM recipes";
$stmt = $dbh->query($sql);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
$dbh = null;
}
catch(PDOException $e){
echo 'Connection failed: ' . $e->getMessage();
}
?>
MySQLのportを8889に指定したところ、エラーが消え正常に実行結果を表示した。
誤:$dsn = "mysql:dbname=db1;host=localhost; charset=utf8";
正:$dsn = "mysql:dbname=db1;port=8889;host=localhost; charset=utf8";
参考になったのはstackoverflowのこの記事。
MAMPで見たときの、各ツールのPort番号。
ここを確認して、デフォルトの8888 と違う、MySQL ポート番号が(ここでは8889)が設定されていたら、ソースコードでも8889と指定すること。そうでないと、8888につなぎに行くからね!
おわりっ!