0

誰かの PHP コードを見直したことがありますが、彼はすべての GET 変数と POST 変数を 1 つのプレーンな古いオブジェクトにまとめて渡すことができる関数またはクラス メソッドを持っていました。同じ名前と値のペアが GET と POST の両方にある場合、POST が優先されます。

正確にこれを行う適切にコーディングされた PHP アドオンはありますか?

4

5 に答える 5

7

を使用することもできます$_REQUESTが、、、、の内容が含まれていること$_GET$_POSTおよび$_COOKIEこのスーパーグローバル内の変数の存在(および上書き目的の順序)は実行環境での構成の影響を受けることに注意してください。

これが問題を引き起こしている場合は、単純なバージョンをロールアップすることをお勧めします。その核心は次のようになります。

$requestData = array_merge( $_GET, $_POST );

次に、これを何らかの方法でまとめることができます。たとえば、stripslashes()を使用してマングルされた値に自動的に適用したりmagic_quotes、欠落している変数のデフォルト値を提供したりするなど、追加の便利な機能を提供します。

于 2009-02-07T19:55:41.143 に答える
2

両方の変数をマージする (または代わりにグローバルを使用$_REQUESTする)と、その値のソースを明確に特定できないため、セキュリティ上の欠陥が発生する可能性があります。そのため、アクセスするときに$_REQUEST['foobar']、値が URL、POST ボディ、または Cookie を介して送信されたかどうかを判断できません。これにより、スクリプトがクロスサイト リクエスト フォージェリに対して脆弱になる可能性があります。

そのため、快適さよりもセキュリティを優先し、値が得られると思われる変数を使用することをお勧めします。$_GETURL で渡されることが予想される引数、$_POSTPOST で渡される引数、および$_COOKIECookie 用。

于 2009-02-08T12:02:54.063 に答える
1

$_GETと混同するのは悪い習慣だと思い$_POSTます。それらは完全に異なるものを対象としており、それらを同等に扱うことで、HTTPプロトコルを効果的に誤用しています。述べたように、$_REQUESTあなたが望むことをしますが、少し予測不可能です。同じことを行うために、独自のグローバル関数を簡単に作成できます。

function param($name, $default = null) {
  return isset($_POST[$name])
    ? $_POST[$name]
    : (isset($_GET[$name])
      ? $_GET[$name] 
      : $default);
}

しかし、本当に..それは悪い習慣です。

于 2009-02-08T00:18:14.657 に答える
0

$_REQUEST グローバル変数を使用できます。これは、アプリケーションが Web sapi (CGI や Web サーバー モジュールなど) で実行されている場合にデフォルトで解釈される PHP によって定義されます。これは、PHP を使用して Web ベースのアプリケーションを作成している場合のアプリケーションの場合です。$_REQUEST は、$_GET および $_POST 内のすべてのデータの連想配列であり、デフォルトで定義されています。それを使用するために拡張機能/ライブラリは必要ありません。

于 2009-02-07T19:39:02.643 に答える
0

これは、アプリ全体でグローバルを処理するフレームワークのクラスです。ここでは、変数の処理は行われません。

class stGlobal

{

//instance
private static $instance;

//global settings
public $post = '';
public $get = '';
public $files = '';
public $request = '';

private function initialize()
{
    $this->post = $_POST;
    $this->get = $_GET;
    $this->files = $_FILES;
    $this->request = $_REQUEST;
}

public function getInstance()
{
    if (!isset(self::$instance))
    {
        $class = __CLASS__;
        self::$instance = new $class();
        self::$instance->initialize();
    }
    return self::$instance;
}

}

どこでも使えるように

$myObj = stGlobal::getInstance();
于 2009-02-08T11:37:50.400 に答える