jQueryでPOSTした値が消える!?

PHP 5.3.x 以降、多数のデータを一度にPOSTするとデータが無効とされ、消えたように見えます。これは max_input_vars によって入力変数 (フォームの入力欄や配列の要素数) が1000個を超えると無効となることが原因です。対策は php.ini で max_input_vars = 10000 、あるいは htaccess で php_value max_input_vars 10000 などと設定します。php.ini 又は htaccess による設定が出来ないケースでは、JavaScript 側からは JSON.stringify などで文字列化してPOSTし、PHP側では json_decode で配列化などすると良いかもしれません。

PHP 5.3.x 以降、多数のデータを
一度にPOSTするとデータが無効とされ、
一見すると消失したように見えます

PHP 5.3.x 以降、max_input_vars という
入力変数を最大で何個まで受け付けるかを
指定する設定項目が存在します。
この初期値は多くの場合で1000です。

max_input_vars integer
入力変数を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル $_GET、$_POST そして $_COOKIE にそれぞれ個別に適用されます)。
http://www.php.net/manual/ja/info.configuration.php#ini.max-input-varsより

例えば、1000を超える入力欄を持つような
入力フォームがあるとします。このような場合、
設定値が初期値のままでは、意図通りに
全データを処理できない
ということになります。

以下のように、jQuery
要素数が1000を超える配列などをPOSTしても、
やはり意図通りに全データを処理できません


var arr = [0, 1, 2, ... 1000]; // 要素数が1001個
$.ajax({
type: 'POST',
data: arr
})

プログラムは完璧で、リクエストも正常、
レスポンスにも異常はなく、HTTPステータスは
もちろん200 OK。
しかし、入力変数 (配列の要素数など) が
1000個を超えてPOSTされるとダメなのです。
データが消失したように見えます。

以下のような場合には max_input_vars を
確認すると良いかもしれません。

  • これまで PHP 5.2.x を使用しており、意図通りに正常動作していた。そこから PHP 5.3.x 以降にバージョンアップした。
  • 1000個を超えるような多数の値を一度にPOSTする可能性がある。

特に、通常は1000個以下であるが、
稀に1000個を超えるような作りになっていると
原因に気付き難いかもしれません。

対策方法1としては php.ini で以下のように設定します。


max_input_vars = 10000

あるいは、対策方法2として htaccess で以下のように設定します。


php_value max_input_vars 10000

実行時にディレクティブを以下のように設定しても
機能しないことでしょうから、 php.ini や
htaccess で設定が効かないようなサーバですと
ちょっと困ります。

ini_set('max_input_vars', 10000);

そのような場合、対策方法3として JavaScript 側では
JSON.stringify などで文字列化
してPOSTし、
PHP側では json_decode で配列化などすると
良いかもしれません。

お問い合わせについて

業務として技術コンサルティングやシステム設計・開発を行っております。
気になることがありましたらご相談下さい。
ご相談のみで完結する場合、コンサルティング費用の目安は
内容によりますが1時間で5千円〜1万円ていどです。
コンサルティングや開発を検討されるその前に、
まずはお気軽にコメントやメールでご連絡下さい。
ご契約前のコメントやメールでのやりとりは無料です。

お問い合わせフォーム

お急ぎの場合など、ただちに業務対応が必要な場合は、こちらのお問い合わせフォームをご利用ください。かきしちカンパニーお客様窓口が直ちに対応いたします。
※窓口へのお問い合わせ、お見積もりは無料です。


お名前 (必須)

メールアドレス (必須)

題名

メッセージ本文 (必須)

Share

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*