PHP の Yii1.1 のシステムで大量レコード更新ができない問題を解決!max_input_vars の落とし穴

 


はじめに

PHP の Yii1.1 のシステムで、フォームから複数レコードをまとめて更新しようとしたところ、「30行以上のレコードを追加できない」という現象に遭遇しました。
一見システムのバグのように見えますが、原因は PHP の設定にありました。今回はその原因と解決方法をまとめます。


現象

  • フォームで複数レコードをまとめて登録・更新できる画面があります。

  • しかし、30行以上を追加して保存しようとすると、後半のレコードが反映されない

  • エラーメッセージは特に出ませんが、追加されたレコードは一部だけです。


原因の調査

PHP には、フォームから送信される input の総数に制限があります。

; php.ini のデフォルト値 max_input_vars = 1000
  • 1 行あたりの input 数 × 行数 がこの上限を超えると、PHP はそれ以降の input を無視します。

  • PHP の Yii1.1 のシステムでは、CActiveForm やパーシャルビューで多数の input を送信している場合、この制限に引っかかりやすくなります。

例えば:

行数1行あたり input 数合計 input 数
30401200 → 1000 を超える

このように、30行以上送信すると max_input_vars に引っかかり、後半のデータが無視されてしまいました。


解決方法

  1. max_input_vars の増加

php.ini を開き、値を増やします。

; デフォルト 1000 → 2000 に変更 max_input_vars = 2000
  • Apache / Nginx + PHP-FPM の場合は、設定変更後に再起動が必要です。

  1. 確認方法

echo ini_get('max_input_vars'); // 変更後に確認
  • これで 30行以上のレコードも正常に保存・更新できるようになりました。


注意点

  • post_max_size が小さい場合も POST データが途中で切れることがありますが、今回のケースでは 2G に設定されており問題ありませんでした。

  • 1行あたりの input 数が非常に多い場合は、max_input_vars を必要以上に大きくしないよう注意してください。


まとめ

  • PHP の Yii1.1 のシステムで複数レコードをまとめて保存・更新する場合、PHP の max_input_vars 制限 に注意が必要です。

  • デフォルト 1000 では 30行前後で制限に引っかかることがあります。

  • php.ini で max_input_vars を増やすと解決します。


💡 ポイント
大量のデータをフォームから送信する場合は、post_max_sizemax_input_vars の両方を確認することがトラブル防止につながります。

コメント

このブログの人気の投稿

WPF経験者が挑戦!.NET MAUIで初スマホアプリ「写時くん」を公開してみた

洋上風力発電の今:三菱商事のゼロベース見直しが示す未来

SSHなしでLet's Encryptの証明書を使って共有サーバーをHTTPS化する方法【完全ガイド】