投稿後にリンクURLが通知されなかったため、このバグは現在まで存続しています。ただし、このバグはすべての送信で発生するわけではなく、いくつかのテストを行った結果、複数の送信が連続して行われた場合にのみ発生することが判明しました。提出されたフォームは比較的複雑で、複数回に分けて入力されていたため、途中でエラーが発生したのではないかと考えられました。
トラブルシューティング プロセスは各プロセスの var_dump($_REQUEST) から始まり、最初のフォームを 2 番目のフォームに送信するプロセス中に、エラー リンクが見つかります。この時点で、$_REQUEST 配列をもう一度確認する必要があります。
マニュアルには、GET、POST、COOKIE メカニズムを介してスクリプトに送信された変数が含まれていると記載されているため、この配列は信頼できません。このように、var_dump($_REQUEST)はvar_dump($_POST)、var_dump($_GET)、var_dump($_COOKIE)に分解されるため、複数のページ間で値を保存する必要があることが分かります。フォームに COOKIE を追加しようとしましたが、Expiry 項目を設定せずに SESSION が終了すると COOKIE は破棄されますが、セッション内で複数の広告が連続して送信された場合、フォーム POST の値は以前に COOKIE に保存されていた値で上書きされます。部分的なエラーのみが発生する理由は、COOKIE に保存するときに、同じ変数名を使用する url 変数を除き、COOKIE 変数名に接頭辞が付けられるためです。
問題は見つかりましたが、同じ変数名でなぜ COOKIE が POST をカバーし、その逆はカバーしないのですか?ということで、ようやくタイトルにあるvariables_order設定項目にたどり着きます。 php.iniの原文は次のとおりです:
このディレクティブは、PHPがGET、POST、Cookie、
環境変数、および組み込み変数を登録する順序を記述します。 G、P、C、E & S はそれぞれ、
EGPCS または GPC と呼ばれます) 登録は左から右に行われ、新しい
値は古い値をオーバーライドします。
つまり、この設定は PHP の順序を記述します。 $_GET、$_POST、$_COOKIE、$_ENV、$_SERVER 配列を含む変数を解析します。
解析順序は左から右で、解析後に新しい値が古い値を上書きします。デフォルト設定は EGPCS (環境、GET、POST、Cookie、サーバー) です。
「GP」に設定すると、PHP は環境変数、Cookie、サーバー変数を完全に無視し、GET メソッドの同名の変数を POST メソッドの変数で上書きします。
結論:
マニュアルにあるように、$_REQUEST は信頼できない配列です。同様の問題を回避するには、送信された値を取得するときに $_POST または $_GET 配列を明示的に使用する必要があります。
特別な場合には、必要な送信データを常に取得できるように、variables_order 設定を調整できます。