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