2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravelしくじり先生その2「sesionsテーブルのidの型はBIGINT!じゃない!!」

Posted at

#TL;DR
VARCHAR(255)(NOT NULLと主キー制約付き)でした。

#前提

  • Laravel Valetで開発環境を構築しています(Docker不使用)
  • Laravel 8.41.0
  • PHP 8.0.8
  • Nginx 1.21.1
  • macOS Big Sur 11.4
  • Laravel Fortifyの認証機能を使用しています
  • .envファイルにてSESSION_DRIVER=databaseにしています。
  • .envファイルにてAPP_DEBUG=falseにしています。
  • データベースmigrationに、Laravel純正のものではなくridgepoleを使用しています

事の発端

本番環境を構築してログインページからフォームのPOSTを送ったところ下記の画面が表示されました。
419|期限切れのページ
「Laravelで419応答ならリクエストにCSRFトークンが含まれていない()」というのがよく言われている原因です。
しかし、実際にはCSRFトークン付きでPOSTリクエストを送信しています。
ここで小一時間悩みました。

解決に至るまでの過程

正常にログイン出来る試験環境と、問題が発生している本番環境との差を確認していったところ
sessionsテーブルのid列の型が
試験環境→VARCHAR(255)
本番環境→BIGINT(2O)
と違いがあり、試験環境のid列には文字列が入っていました。
下記SQL文を実行して本番環境のid列の型を変更したところ、419応答が無くなり、無事ログインできるようになりました。
ALTER TABLE `データベース名`.`sessions` CHANGE COLUMN `id` `id` VARCHAR(255) NOT NULL;
BIGINT(2O)としてid列の型が作成された理由は、ridgepoleでのmigrationをデフォルトのまま使用したためです。

しくじりの理由

「データベース起因のエラーならSQLSTATEで始まるエラーが返ってくるのが普通」
「idという列名なら数値以外のデータ型はあり得ない」
と言う思い込みが、問題解決までの道のりを遠ざけていました💦

最後に

マサカリ大歓迎です。
よろしければ、LGTMボタンを押して行ってくださいね🌟

見出しの出典

これまでのしくじり

Laravelしくじり先生その1『(型宣言を)「ガチガチにやらなきゃモチモチにならない」と言ったな。あれはやり過ぎ注意だ。』

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?