なぜか空欄ができる!とお客様から連絡を受けて調査
DBを確認すると空欄行が出ている箇所のデータがなぜかNULLになっていた。
ローカルだと再現ができず、フロント側もサーバー側も処理内容はこれといって問題は特になかった。
(怖いですが)(仕方なく)本番環境からローカルにDBのデータを持ってきてお客様が行った操作を真似したところ再現。
再現した際に以下のような警告が発生していたのを発見。
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer:
これを調べると、サーバー側で受け取るパラメーターの数が設定値を超えた場合に発生することが判明。
その設定値が記載されているのが php.ini の max_input_vars です。
デフォルトでは1000件までになっていますが、これを超えると1000件以降のパラメーターは自動的に切り落としてそのまま処理を続けようとします。
パラメーターを配列にしていてもその配列の中身毎にカウントされるようでした。
そのために今回のように急にデータが切り落とされた分はNULLとして登録されてしまうということが起きてしまったみたいです。
なんだよこの設定は!!!と思ったのですが、PHPの公式ドキュメント内でこのような説明がありました。
このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。
https://www.php.net/manual/ja/info.configuration.php#ini.max-input-vars
どうやらセキュリティのためにある設定みたいなので納得しましたとさ。