ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

CakePHP is NOT able to connect to the database. を解決する


この記事の続き

前回はこれがローカルサーバーを使い表示されるところまでやりました。
f:id:nekonenene:20160401010512p:plain

よく見ると、下の方にエラーがあります。
f:id:nekonenene:20160401201314p:plain

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' に直してください。

そうして上書き保存してからふたたびアクセスすれば、
しっかりとデータベースにアクセスできるようになったと表示されるはずです。
f:id:nekonenene:20160401204326p:plain

新規ユーザーでアクセス

とまあ、ここまではいいものの、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 にアクセスする権限すらありません。

それは、MySQLコマンドライン

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;

このように設定してからもう一度アクセスすると、データベースへのアクセスに
成功していることが確認できることでしょう。
f:id:nekonenene:20160401204326p:plain


さらに続き↓