データベースへの接続方法 (エラー対策付き)

PHPのフレームワーク、Laravelを使ったデータベースと接続するための方法を書きます。

MySQLの場合を想定していますが、sqlite以外であれば基本的には同じです。MySQLのインストールはご自身で行なってください。MySQLがインストールされているか確認するためターミナルで以下のコマンドを実行してください。

$ mysql --version

バージョンが表示されればOKです。

手順

  • ローカルにデータベースを作成します
  • 環境変数の設定
  • configの設定
  • 接続確認
  • 接続確認中にエラーが発生した場合

ローカルにデータベースを作成します

ローカル(お使いのPC)にデータベースを作成します。 ターミナルで以下のコマンドを実行してください。

/// mysqlを起動する
$ mysql.server start

/// mysql内に入る
$ mysql -u root -p

/// パスワードを入力後、データベースを作成する
mysql> CREATE DATABASE <database名>;

/// 今回は「sample」というデータベースを作成します。
mysql> CREATE DATABASE taskapp;

/// 作成されていることをデータベース一覧で確認
mysql> show databases;

データベース一覧の中に sample というデータベース名が存在すればOKです

環境変数の設定

.env ファイルに以下のような項目があると思います。

DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

この項目を以下のように変更してください。

DB_DATABASE=ローカルのデータベース名
DB_USERNAME=MySQLにアクセスするためのユーザー名
DB_PASSWORD=MySQLにアクセスするためのパスワード

先ほど sample というテーブルを作りました。仮にユーザー名、パスワードが root の場合は以下のようになります。

DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=root

configの設定

Laravelで作られたアプリケーションがデータベースと接続する時の設定は config/database.php に書かれています。内容を見てみましょう。

まず使われるデータベースの種類が何か?が設定されています。

'default' => env('DB_CONNECTION', 'mysql'),

ここで登場する env() という関数について説明します。

env() とは?

これは第1引数で .env ファイルの項目を指定し、第2引数でもし .env ファイルに指定した項目がなかった場合のデフォルト値を記述します。

つまり上記の設定は、使用されるデータベースの種類は .env ファイルの DB_CONNECTION の項目の物を使います。ただし、もし .env ファイルの DB_CONNECTION の項目が無ければ、 mysql を利用しますという意味になります。

細かな設定

同じファイル内の connections という項目に書かれています。 connections の中に mysql と書かれており、さらに database , username , password が書かれていると思います。

こちらにも先ほどと同じように env() が使われています。それぞれの項目が .env ファイルに存在するかを確認し、無い場合のデフォルト値が指定されています。

先ほど .env ファイルに DB_DATABASE , DB_USERNAME , DB_PASSWORD を書いたのでそちらの値が利用されます。

接続確認

routes/web.php に以下の実装をしてください。DBファサードというものを利用して、http://127.0.0.1:8000/database にアクセスしたときに、接続しているデータベース名を表示するようにしています。

Route::get('/database', function() {
    var_dump(((array) DB::select('SELECT database();')[0])['database()']);
});

ターミナルで php artisan serve を実行して、http://127.0.0.1:8000/database にアクセスしてみましょう。エラーが発生せず、 sample という文字が表示されていれば無事に接続ができている証拠です 🙆‍♂️

接続確認中にエラーが発生した場合

Unknown database 'sample'

このエラーが発生した場合はデータベースの作成がうまくできていません。「ローカルにデータベースを作成」にもどって作成し直してみてください。

Access denied for user 'ユーザー名'@'ホスト名'

エラー文の ユーザー名 , ホスト名 にはそれぞれ .env ファイルの DB_USERNAME , DB_HOST が入っているはずです。このエラーが発生した場合、原因は以下の2つが考えられます。

  • MySQLにアクセスするためのユーザー名、パスワード、ホスト名のどれかが間違えている
    →【解決策】.env ファイルの内容が正しいか確認をしてください
  • データベースが起動していない
    →【解決策】ターミナルで mysql.server restart を実行してみてください

Undefined index: database()

このエラーが発生した場合は routes/web.php を以下のように書き換えてください。

Route::get('/database', function() {
    var_dump(DB::select('SELECT database();')[0]);
});

http://127.0.0.1:8000/database にアクセスした際に表示されたテキストに sample と書かれていればOKです。

.env ファイルを変更しても値が変更されない

この場合は起動しているアプリケーションを一度閉じて(ターミナルでコマンド + C)、再度 php artisan serve をターミナルで実行してみてください。