form タグ内で [] で括った大量の input データを PHP – $_POST でまとめて受け取る際に、input のデータ数が多く PHP.ini – max_input_vars の制限で データの受け渡しが途切れてしまう場合の回避方法をご紹介いたします。
目次
input 配列データを $_POST で受け取る
データベースを使ったシステムなどで、テーブルの ID フィールドなどを form タグ内で配列データとして定義し、以下のように出力しているとします…
while (条件式){
echo "<input type='hidden' name='HogeHogeID[]' value='{$rec['HogeHogeID']}' />";
}
受け取り側の PHP ファイルでは、上記の配列データ HogeHoge[] を以下のように受け取るようにコーディングします…
foreach ($_POST['HogeHogeID'] as $key => $value){
//CSV 出力などの処理
}
このとき、配列の要素数が PHP.ini – “max_input_vars” の既定値 1,000 を超えると、データの受け渡しが途中で途切れてしまい システム的に不具合になってしまいます、、
max_input_vars
PHP.ini の “max_input_vars” は、form データを $_POST で受け取る際の要素数の制限を定義しているパラメータです。
仮に、開発中のシステムで $_POST で受け取るデータ数が 既定値の 1,000 を超える場合には “max_input_vars” を 2,000 などに書き換えれば良いのですが … ここで厄介なのが、“max_input_vars” パラメータは ini_set() 関数で動的に書き換えることができないという仕様があり、、PHP.ini ファイルを直接書き換えなければいけないのです、、
加えて、では “max_input_vars” を “2,000” に変えておき…いや、2,001 以上の配列になったら、、では “10,000” にしておけ!いや 10,001 個以上になったら・・・この繰り返しになってしまい、、、定期的に PHP.in を書き換えなければならない可能性を残すのも問題です、、(100,000,000 などの有り得ない数にしておけば良いのでは?という話しもありそうですが、それでは問題があるから max_input_vars が定義されている … という気もするので 思い切って大きい数字を書き込むのにも少々抵抗があります…)
そこで、、、
配列データを1個に!?
全く論理的ではないかもしれませんが、“max_input_vars” に振り回されたくない!という方のために、根本的なデータの渡し方を変えてしまうのはいかがでしょう?ということで別の受け渡し方のご提案をご紹介いたします。
上記の “HogeHogeID” を(例えば)「;」(セミコロン)などでつないで一つの文字列にし、form 内では1個の input データとして定義し、$_POST で受け取ったあとで explode 関数で配列変数に展開する…というやり方で逃げましょう!という提案です。。
サンプルコード
上記の form 側の例文は、以下のように「;」でつないで1つの変数にまとめてから出力します…
strHogeHogeID = "";
while (条件式){
strHogeHogeID .= $rec['HogeHogeID'] . ";";
}
echo "<input type='hidden' name='HogeHogeID' value='" . $strHogeHogeID . "' />";
受け取り側の PHP ファイルでは、以下のようにデータを受け取ったあとで explode 関数で配列に展開します…
$aryHogeHogeID = explode(";", $_POST['HogeHogeID']);
for ($i = 0; $i < count($aryHogeHogeID) - 1; $i++){
//CSV 出力などの処理
}
まとめ
少し邪道かもしれませんが、、受け渡すデータサイズはほぼ同じで “max_input_vars” の制限を回避できたと思います。。
SNS開発18年で2つのSNSを開発・運用中の当社が、あなたのアイデアを形にするお手伝いをします。