【Laravel】初心者のエラーメモ

最近Laravelで個人開発を始めましたが、ちょくちょくエラーでハマることがあったのでそれをメモする場です。
＊環境
XAMPP 7.4.5
PHP 7.4.5
Laravel 7.21.0

#array_merge(): Expected parameter 2 to be an array, string given
2020.7.26
　「array_merge()の第2引数は配列なんだけど文字列が入ってるよ」という意味です。array_merge()を使っていないのに出た時は、view()の所かもしれません。第2引数をよく連想配列にするのを忘れます。

```php
<?php
use App\Http\Controllers;
use Illuminate\Http\Request;
use function view;
class LaravelController extends Controller {

    public function post(Request $request) {
        $name = "そらびと";
        //誤
        //return view("laravel", $name);

        //正
        return view("laravel", ['name'=>$name]);
    }
}
```
#htmlspecialchars() expects parameter 1 to be string, array given
2020.7.27
「htmlspecialchars()の第1引数は文字列なんだけど配列が入ってるよ」という意味です。htmlspecialchar()なんて使ってないよ！という場合、{{$【変数名】}}に正しくデータが入っていないことが原因であることが多い気がします。

#Target class [...] does not exist.
2020.7.28
　・web.xmlのルート情報がない
　・第2引数の文字列が間違っている
　・コントローラーのファイル名かクラス名が間違っている
　・コントローラのnamespaceが間違っている
　どれかが原因です。まだ考えられる原因ありそうですが。
 
#include(...): failed to open stream: No such file or directory
2020.7.28
　includeを使っているファイルであればそこのところを確認しましょう。
「...」の所に「vendor\composer」が入っている場合はコマンドプロンプトで
`composer update`
してみてください。それで直りました。

参考サイト：[【php】laravelで-vendor以下のディレクトリが見つからない時](https://mokabuu.com/it/php/【php】laravelで-vendor以下のディレクトリが見つからない時)

#419 Page Expired
2020.7.28
　<form>タグを使っている時、@csrfを入れ忘れていませんか？
＊Laravel5.6以前は{{csrf_field()}}になります。

参考サイト：[【Laravel5】たまに出てくる「the page has expired due to inactivity. please refresh and try again」を表示させない](https://qiita.com/sola-msr/items/8a0ea0abe510245760ac)

#403 This action is unauthorized
2020.7.28
　コマンドプロンプトなどで
`php artisan make:request 【クラス名】`
で作ったクラスを利用している場合、authorize()でfalseが返ってきていることが原因と思われます。

参考サイト：[【Laravel5.8】FormRequestを使うとThis action is unauthorized.が吐き出される](https://nekorokkekun.hatenablog.com/entry/2019/07/13/223834)

#Call to undefined function ...
2020.7.30
*【呼び出し元と違うクラスの関数の場合】*
　・useで使う関数があるクラスを指定し忘れている
　・呼び出し先のクラスのnamespaceが間違っている
　・関数名を間違えている
*【呼び出し元と同じクラスの関数の場合】*
　・関数名を間違えている
　・*「$this::」を忘れている*

#SQLSTATE[HY000] [1045] Access denied for user 【データベース名】 (using password: YES) (SQL: select * from `sessions` where `id` = 【セッションID】 limit 1)
2020.8.3
　データベース接続に失敗している模様です。設定ファイルを見直しましょう。僕の場合は、.envの以下の部分を消去しました。(.envはdatabase.phpより優先して適用されるらしいです。.envの方を設定してdatabase.phpを設定しない手もOKかも？)

```.env
DB_HOST=...
DB_PORT=...
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...
```
代わりに、configディレクトリにあるdatabase.phpで次のように設定します。(MySQLの場合)

```database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '...'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', '...'),
            'username' => env('DB_USERNAME', '...'),
            'password' => env('DB_PASSWORD', '...'),
            //略
```
今回、レンタルサーバーで詰まったわけですが、hostの所はlocalhostではなくてお知らせされたホスト名を入れないといけなかったようですね。
↓XServerの場合のホスト名。サーバーパネルにログインして「MySQL設定」のページの下の方にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261325/76a9a18d-7a85-b48c-11f2-40312067e7b3.png)

#Creating default object from empty value
2020.8.8
　EloquentでSQL発行して操作した時に出ることがあります。この場合、使おうとしているモデルクラスの型を間違えていたり、変数を間違えていませんか？

```php
$items = new Items();

//誤
$guests->id = $request->id;
//正
$items->id = $request->id;
```
2020.8.23追記
　条件に使う値がnullになっているなどの理由でSQLで検索しても結果が0件になっても発生することがあります。SQLも確認してみましょう。

#SQLSTATE[HY000]: General error: 1364 Field 'updated_at' doesn't have a default value (SQL:【SQL文】)
2020.8.12
　「updated_atは必須だけど空で登録しようとしてるよ」という意味になります。null禁止のカラムに値入れ忘れていないかチェックです。
　セクションに書いているようにエラーメッセージに'updated_at'が入っていたら、それはModelクラスの次の一文が原因です。取り除くと解決します。
`public $timestamps = false;`