CakePHP is NOT able to connect to the database. を解決する
この記事の続き
前回はこれがローカルサーバーを使い表示されるところまでやりました。
よく見ると、下の方にエラーがあります。
Databaseに接続できていない様子。
CakePHPのTutorialでここらへんのことは説明されているものの、
私みたいな MySQL 未経験者にはいろいろ説明がハショってありすぎてわかりません。
MySQL でのデータベースとユーザーの作り方を追っていきましょう。
データベースの作成
MySQL の初期設定
mysql_secure_installation
とコマンド。基本は y でいいらしい。
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
の項は、個々人のセキュリティ意識によりますね……。( 0 で充分だと思うけど)
MySQL コマンドラインツールに入る
mysql -uroot -p
パスワードを求められたら、先ほどの初期設定で決めたパスワードを入力。
mysql> って表示されるので、ここにコマンドを入力することで
(ローカルサーバーの)MySQL をいろいろいじっていけます。
データベース cake_blog を作成
チュートリアル通りに cake_blog という名前のデータベースを作ってみましょう。
create database cake_blog;
これでOKです。最後のセミコロンは必要ですのでお忘れず。
cakePHP の app.php をいじる
さて、ここで、プロジェクトフォルダの config/app.php を見てください。
cakePHP ver.3.2.3 では、216行目以降のところに
'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost',
とまあ、いろいろ書かれていると思います。この箇所をいじります。
'host' => 'localhost'
は、前回の記事にて、local.web というドメイン名にしましたので
'host' => 'local.web' に。
'username' => 'my_app' は、 'username' => 'root' に、
'password' => 'secret' は、先ほどの MySQL の初期設定のときに入力したパスワードを、
'database' => 'my_app' は、 'database' => 'cake_blog' に直してください。
そうして上書き保存してからふたたびアクセスすれば、
しっかりとデータベースにアクセスできるようになったと表示されるはずです。
新規ユーザーでアクセス
とまあ、ここまではいいものの、root ユーザーのパスワードを平文で書いちゃうのは気持ち悪いので
新規ユーザーを作りましょう。
MySQL に新規ユーザーを登録
ユーザー名:cake_user パスワード:cakecaketest
としたいとして、以下のように SQLコマンドラインに入力していきます。
set global validate_password_policy=LOW; ## デフォルトではパスワード強度設定が MEDIUM なので cakecaketest というパスワードにするには LOW に変更する必要がある create user cake_user@localhost identified by "cakecaketest";
これで作られました。
作られたユーザー一覧は以下のコマンドで確認できます。
select user, Host from mysql.user;
ユーザーの名前変更は、例えば以下のように書くことで可能です。
rename user cake_user@localhost to new_user_name@localhost;
cakePHP の app.php をいじる
先ほどと同じように config/app.php ファイルをいじります。
'username' => 'cake_user',
'password' => 'cakecaketest',
と直しましょう。
新規ユーザーのアクセス制限を変更
これで大丈夫かに思えてまだです。
今作った新規ユーザー cake_user は、作ったデータベース cake_blog にアクセスする権限すらありません。
show grants for cake_user@localhost;
と打つと、
+-----------------------------------------------+ | Grants for cake_user@localhost | +-----------------------------------------------+ | GRANT USAGE ON *.* TO 'cake_user'@'localhost' | +-----------------------------------------------+
と表示されることからも読み取れます。
これは、すべてのデータベース(*.*)に対してなにも権限がない(USAGE)ことを示しています。
参考 : 権限の種類と設定されている権限の確認(SHOW GRANTS文) - ユーザーの作成 - MySQLの使い方
ですので、このように MySQLコマンドラインツールにコマンドし、権限を増やしてあげましょう。
grant select on *.* to cake_user@localhost;
これで、cake_user は、データを取得する SELECT メソッドをすべてのデータベースに対して使用できるようになりました。
データの追加や更新などが行えない、読み取りだけ可能な権限です。
もちろんこの権限だけでは cakePHP のチュートリアルがこなせませんから、
データベースをひと通りいじれるようにするためには、以下のように権限を与えるのが良いでしょう。
grant select,insert,update,delete on *.* to cake_user@localhost;
このように設定してからもう一度アクセスすると、データベースへのアクセスに
成功していることが確認できることでしょう。
さらに続き↓