生PHPでmysqlを使おうとした
生のphpでアプリケーションを自作していると、基本的な設定の段階から知らないことが多くて時間を取られてしまった。頻繁に打つコマンドは整理しておかないと同じ苦労をしそうなので記録しておく。
mysqlのインストール
$ brew install mysql
インストール後、php.iniからmysqlの行でセミコロンを削除する
起動
$ brew services start mysql@5.7
接続
CLIでのmysqlへの接続。-uはユーザ名
$ sudo mysql -u root -p
-uはユーザー名、-pはパスワードを指定する時のオプション。
設定ファイル httpd.conf
はApplications/MAMP/配下にある。これは先代macで学習していた頃の名残だと思うが記憶にない。ネットの記事の人は /usr/local/etc/httpd/
などに保管しているので、修正したほうがいいのかも?ただここは今のところ問題なさそうなので、後回しにする。
エラー
sqlの準備ができたのでphpを実行。データベースに接続する段階でエラー発生。
try {
$pdo = new PDO('mysql:host=localhost;port=8888;dbname=mvc;charset=utf8','root','パスワード');
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
Connection failed: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)(base)
データベースが絡むコードなので設定ファイルやmysqlの環境構築で何か間違えているのでは?と考え、手元にあった「独習PHP」の助言をもとにApacheの再起動を試してみることにした。
Apacheの起動・再起動
$ sudo apachectl start
これでhttpdのプロセスが起動する。(ps aux|grep httpd
でプロセス確認したがユーザ名が本名なので割愛)。しかしphpに戻り実行すると同じエラーが返る。
sudo httpd -k start
でもApacheを起動できるらしい。しかし
$ sudo httpd -k start
Password:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using MacBook-Pro.local. Set the 'ServerName' directive globally to suppress this message
httpd (pid 70664) already running
こちらは何故かエラー。 httpd.conf
でserverNameが設定されていない時に起こるエラーらしいが、確認したところ
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
ServerName lhttpd -vocalhost:8888
しっかり書かれている。おそらく去年MAMPを使っていた時に編集していたもの。とりあえずapachectlのほうで動くので後回しに。
結論
PDOのコンストラクタに渡すパスワードが間違っていただけだった。phpmyadminでrootユーザに設定していたパスワードを誤って書いていた。が、エラー解消のために調べた無関係な情報がもったいないので整理しておく。
ところで、phpmyadminにあるユーザ、DBの情報がコマンドラインでsqlを操作している時の情報と被っていない理由が気になる。
Discussion