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()
{
//
}
}
その他
気づいたら追加していきます。