PHPで一度に沢山のkeyをPOSTさせる時は、php.iniのmax_input_varsの設定値に注意

php

PHPで1つの画面から一度に大量のkeyをPOSTするような場合、POSTしたデータをDBに保存したら途中までしか保存できていなかったということがあった。今回はその原因と解消方法について、実例を基に書く。対象となるPHPバージョンは5.3.9以降。

一度のPOSTでサーバーサイドに渡せるkeyには上限数(max_input_vars)が設定されている

結論から言うと、php.iniにはmax_input_varsという設定値があり、これが一度にPOSTでサーバーサイドに渡せる入力変数の最大数を制御している。max_input_varsの設定を超える量の入力変数を渡した場合、PHP処理は途中で止まることなく進んでいくが、Apache側のエラーログに下記のようなWarningが吐き出される:

 

 

これを解消するには、max_input_varsを適切な数字に設定してApacheをgracefulすることで、入力変数が1000個以上でも対応できるようになる。もしmax_input_varsの設定をコメントアウトしていた場合、デフォルト値として1000が適用される点も注意。

 

ちなみに、POSTだけでなくGETやCOOKIEに関しても同じ設定が適用されるらしい。URLに大量のクエリパラメータを使うような場合にも注意が必要。

max_input_varsの上限に引っかかった実例

実際にmax_input_varsの上限に引っかかって思ったような処理ができなかった実例としては、都道府県市区町村のチェックボックスに1つずつチェックを入れてサーバーサイド側に保存させようとする処理が挙げられる(全国の市区町村は1000を超える)。

「そもそもそれってUI的にも実装的にもどうなんだ」

と言われても仕方ない話ではあるが、実際にオペレーションが滞る事態だったので、取り急ぎmax_input_varsの値を変更して凌いだ経験あり。ただ、max_input_varsの存在理由は不用意に多数の入力変数を渡せないようにしてセキュリティを高めることにあるので、単に増やして解決というものではない。

 

こういう場合、根本的な解決策としては1入力変数の配下にチェックボックスの値を配列構造で渡すよう、PHP側のプログラミングを書き換えることではないかと思っている。今度機会があったら試してみる予定。