先日「批評空間にて点数を入力し更新しようとすると、無効のリンクと表示される」というご申告を頂きました。

ErogameScapeでは、GETやPOSTで渡ってくる値を検証(バリデーション)した結果、想定した値でない場合は404を返します。 

ご申告から、検証にひっかかっていると推測して調査しました。
申告頂いた方に点数を入力したフォームのURLを伺って試してみると…

1. フォームが送信したPOSTの内容 → 問題なし
2. PHPで受信したPOSTの内容(print_r( $_POST )で確認します。) → 1.の内容と相違有り

ApacheはPOSTした内容を制限するディレクティブ(LimitRequestBody)があります。
一応、設定していないことを確認しました。

PHPで何か悪さしているに違いないと思うのですか、本当にPHPが悪いのか分からないので、Apacheが受け取ったPOSTの内容がみたいなあと思いました。

そこで、 Apache 全I/Oデータをログするを参照してPOSTをログに出力する設定を実施。
error.logに結果が出力されるそうですので、tail -f error.logを実行したところ

 [Wed Dec 19 23:14:52 2012] [error] [client 192.168.0.12] PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer: http://192.168.0.15/~ap2/ero/toukei_kaiseki/contents_tokuten_ichiran_default.php?mode=aiueo&gyou=a

と書いてありました。

Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
ということで、php.iniを見ても、 max_input_varsという設定がない。

max_input_varsをgoogleで検索すると php.ini で mbstring.encoding_translation を有効にすると max_input_vars が有効にならない(PHP 5.4.8以前、PHP 5.3.18以前) - t_komuraの日記にPHP 5.3.9 で max_input_vars が導入された(hashdos 脆弱性対策)とありました。

PHPのマニュアルでmax_input_varsを確認すると、PHP: 実行時設定 - Manualに該当項目がありまして、
入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル $_GET、$_POST そして $_COOKIE にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は E_WARNING が発生し、 それ以降の入力変数はリクエストから削除されます。 多次元配列の場合、この制限は個々の次元ごとにしか適用されません。
とのことです。

そういえば、最近phpのverをあげたな…
/etc/php.iniのある場所に、/etc/php.ini.rpmnewがありました…

※ソフトのVerをあげた際に設定項目に変更があると、.rpmnewというファイルが生成されます。Verをあげる際にはちゃんと新しいiniファイルで設定しなおさないと駄目です。

 /etc/php.ini.rpmnewを確認すると、max_input_varsがありました。

max_input_varsのデフォルトは1000です。
多分、普通の入力フォームですと、1000を超えることはない…どころか100を超えることもない気がしますが、ErogameScapeはとてもたくさんのデータを一度に入力できるので1000では足りてませんでした。

max_input_varsをそれなりな値に設定して、めでたくデータが入力できるようになりました。

教訓
 verをあげる場合は、ちゃんと追加された設定項目を確認しよう

類似話題
 php.iniのmax_input_varsというパラメータ « kawama.jp