PHPフレームワークLaravelでよくやりがちなミスを備忘録としてメモしていきます。

データベースに接続できない

エラーメッセージ

Illuminate\Database\QueryException SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES) (SQL: select * from `articles`)

原因

データベースに接続しようとしたがアクセスが拒否された。データベースに接続する際は接続するデータベース名、ユーザ名、パスワードが最低でも必要だがこれが不足もしくは誤っている。

対処方法

config\database.phpの設定を確認する必要がある。特に、下記コードのXXXのあたり。

'database' => env('DB_DATABASE', 'XXX'),
'username' => env('DB_USERNAME', 'XXX'),
'password' => env('DB_PASSWORD', 'XXX'),

さらによくある誤りとしては、database.phpよりも.envの設定のほうが優先されるため、こちらの設定で上書きされている場合があるので確認すること。下記コードのXXXのあたり。

DB_DATABASE=XXX
DB_USERNAME=XXX
DB_PASSWORD=XXX

サーバにデプロイすると動かない

エラーログ

PHP Parse error: syntax error, unexpected '?' in /home/hogehoge/public_html/laravel/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php on line 233

原因

Laravel5.5はPHPのバージョンが7.0.0以上を必要としています。PHPのバージョンが7未満だと上記エラーになる場合があります。特にCentOSをはじめとするサーバOSはデフォルトでPHP7以上になっているものが少ないため、注意が必要です。

対処方法

まずはPHPのバージョンを確認します。サーバOSでphp -vコマンドを入力してバージョンを確認します。

>php -v
PHP 7.1.11 (cli) (built: Oct 25 2017 10:24:28) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

バージョンが7未満のときはPHPのバージョンアップが必要です。
以下、CentOS系の場合で説明します。

php7のリポジトリがあるかどうかを確認します。
yum repolist allコマンドを入力します。

>yum repolist all
Loaded plugins: fastestmirror, langpacks, priorities
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * remi-safe: mirror.bebout.net
 * updates: ftp.riken.jp
repo id                          repo name                        status
C7.0.1406-base/x86_64            CentOS-7.0.1406 - Base           disabled
・・・省略
remi-php71                       Remi's PHP 7.1 RPM repository fo disabled
remi-php71-debuginfo/x86_64      Remi's PHP 7.1 RPM repository fo disabled
remi-php71-test                  Remi's PHP 7.1 test RPM reposito disabled
remi-php71-test-debuginfo/x86_64 Remi's PHP 7.1 test RPM reposito disabled
・・・省略

上記のようにremi-php71のようなPHP7系統のリポジトリがあれば、そのままでインストール可能です。ない場合はリポジトリをインストールしてください。
--enablerepo=remi,remi-php71でPHP7系統のリポジトリを有効にしてインストールすることで、PHP7.1をインストールします。以下のコマンドを実行します。入力するパッケージは一つの例です。必要なものは追加してください。
yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-mcrypt

php artisan migrateでSyntax errorになる

Artisanでマイグレーションしようとすると、以下のエラーになることがあります。

>php artisan migrate
Migration table created successfully.

  [Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

  [PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

原因

Laravelのドキュメントに以下の記載があります。

Laravelはデータベース中への「絵文字」保存をサポートするため、デフォルトでutf8mb4文字セットを使っています。バージョン5.7.7より古いMySQLや、バージョン10.2.2より古いMariaDBを使用している場合、マイグレーションにより生成されるデフォルトのインデックス用文字列長を明示的に設定する必要があります。

引用元: インデックス長とMySQL/MariaDB

対処方法

AppServiceProvider中でSchema::defaultStringLengthを呼び出します。
下記プログラムの6行目、17行目を追加します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

その他

気づいたら追加していきます。