$ _REQUEST、$ _ GET、$ _ POSTのうち、どれが最速ですか。


177

これらのコードのどれが速くなりますか?

$temp = $_REQUEST['s'];

または

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
3番目のケースがあります。!isset($_REQUEST['s'])
フランツ

5
他の人があなたのコードを明確に理解することはどれほど重要ですか?POSTおよびGETは明示的ですが、REQUESTはさまざまなソースから取得できます。リクエストごとにREQUEST、POST、およびGETスーパーグローバルが常に読み込まれるため、効率は無視できると思います。
ケビン

回答:


273

$_REQUESTデフォルトでは、内容が含まれ$_GET$_POSTそして$_COOKIE

しかし、これはデフォルトにすぎず、これはに依存しvariables_orderます。Cookieを使用したいかどうかわからない。

私が選択しなければならなかった場合、私はおそらく使用しないだろう$_REQUEST、と私は選ぶだろう$_GET$_POST- 私のアプリケーションは、何をすべきかに応じて (すなわち、1つまたは他の、両方ではない):一般的に言えば:

  • $_GET誰かがアプリケーションからデータ要求しているときに使用する必要があります。
  • また$_POST、誰かがアプリケーションにデータプッシュ(挿入または更新、または削除)するときに使用する必要があります。

どちらの方法でも、パフォーマンスに関してはそれほど大きな違いはありません。スクリプトの残りの部分と比べて、違いはごくわずかです。


1
理想的には、常に$ _REQUESTを使用できる必要があります。しかし、もちろんそれは完璧な世界に過ぎません。
タイラーカーター、

2
$ _REQUESTは、$ _ POSTおよび$ _GETを直接使用するよりも(または少なくとも以前は使用されていた)おそらく高価です。
Darrell Brogdon、

3
パフォーマンスの違いは無視できるという概念の+1、および保守の観点の重要性:$ _GETおよび$ _POSTは、$ _ REQUESTができない方法で意味を伝えます。
Jon Cram、

9
$ _REQUESTを使用しても、XSS / XSRFは発生しません。XSS / XSRFのニュアンスを理解しないと、XSS / XSRFが発生します。トークンで軽減する限り、問題はなく、$ _ REQUESTを使用する利点があります(すべての変数が1つのスーパーグローバルにあります)。'variables_order'のため、他のスーパーグローバルに基づいて使用する前に、実際に$ _REQUESTを再構築します。$ _COOKIE、$ _ GET、$ _ POSTの順に処理します。そうすることで、POST変数の優先度が最も高くなり、Cookie変数の優先度が最も低くなるため、いくつかのバグ(Adobe Flashやマジッククオートなど)を暗黙的に修正できます。
CubicleSoft

名前の中で、Get = get from、Post = post to
Grumpy

32

GETとPOST

1)GETとPOSTの両方で配列が作成されます(例:array(key => value、key2 => value2、key3 => value3、...))。この配列はキーと値のペアを保持します。キーはフォームコントロールの名前、値はユーザーからの入力データです。

2)GETとPOSTはどちらも$ _GETと$ _POSTとして扱われます。これらはスーパーグローバルです。つまり、スコープに関係なく常にアクセスできます。特別なことをしなくても、関数、クラス、ファイルからアクセスできます。

3)$ _GETは、URLパラメーターを介して現在のスクリプトに渡される変数の配列です。

4)$ _POSTは、HTTP POSTメソッドを介して現在のスクリプトに渡される変数の配列です。

GETを使用する場合

GETメソッドを使用してフォームから送信された情報は、誰でも見ることができます(すべての変数名と値がURLに表示されます)。GETでは、送信する情報の量にも制限があります。制限は約2000文字です。ただし、変数はURLに表示されるため、ページをブックマークすることが可能です。これは、場合によっては役立ちます。

GETは、機密ではないデータの送信に使用できます。

注:GETは、パスワードやその他の機密情報の送信には使用しないでください。

いつPOSTを使用するのですか?

POSTメソッドを使用してフォームから送信された情報は、他の人には見えず(すべての名前/値はHTTPリクエストの本文に埋め込まれています)、送信する情報の量に制限はありません。

さらに、POSTは、ファイルをサーバーにアップロードする際のマルチパートバイナリ入力のサポートなどの高度な機能をサポートします。

ただし、URLには変数が表示されないため、ページをブックマークすることはできません。


6
REQUESTについても追加してください。
Black Mamba

$ _REQUESTはどうですか?
アーミルカリミ

22

$ _GETは、クエリ文字列またはURLから変数を取得します。>

$ _POSTは、(一般に)フォームなどのPOSTメソッドから変数を取得します。

$ _REQUESTは$ _GETと$ _POSTのマージであり、$ _ POSTは$ _GETをオーバーライドします。検証用の自己参照フォームで$ _REQUESTを使用すると便利です。


3
+1これは基本的に私が教えたものです。他の回答ほど技術的ではありませんが、覚えやすくなります(GETクエリ文字列POSTから、フォーム送信から)。
jp2code 2014

18

私が使用してお勧めしたい$_POST$_GET明示。

いずれにしても、適切なサイト設計では$ _REQUESTを使用する必要はありませんCSRF/XSS。また、URLにデータを保存することによる攻撃や他のばかばかしさへの対処を怠るなどの欠点もあります。

速度の違いはどちらの方法でも最小限に抑える必要があります。


8

REQUESTを使用します。そのような単純な操作の速度を気にする人は誰もいませんし、コードがよりすっきりしています。


7
多くの状況で、GETまたはPOSTはどちらかを使用するのではなく、状況に基づいて選択する必要があることに注意してください。
ceejayoz

3
誰も気にしないのはあなたの言うとおりですが、私の意見で$_REQUESTは、使用することは間違った結論です。私の答えを見てください。
フランツ

4
$ _REQUESTの使用が$ _GETまたは$ _POSTに比べてよりクリーンなのはなぜですか?$ _REQUESTは同じロジックを舞台裏で実行し、GETまたはPOSTのいずれかを選択すると、より詳細に制御できます。
ジェイ・ゼン

6
_REQUESTがより衛生的であるという主張には、詳細な説明が必要です。

2
ユーザーがURLをコピーして同じ操作を実行できるようにする場合は、GETを使用することをお勧めします(URLは「google.com/q=searchWord」のように表示されますが、POSTを使用してデータをWebサイトに投稿する必要があります)それは一度だけ挿入されるべき、または大量のデータがアクティブで、ユーザーがなど、ログイン、データベースにデータを挿入するようなURLを維持することはできないはず
ディーン・ミーハン

7

心配しないで。ただし、セキュリティ上の問題があるため$_REQUEST$_GETおよび$_POSTその配列の唯一のソースではないため)、2番目のソリューション(およびこれらの変数が存在しないことに対する追加のチェック)を使用する必要があります。

$_REQUEST昨日の問題についての投稿があったと思います。探しに行こう。

編集:まあ、直接の投稿ではありませんが、とにかくここにあります:http : //kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

安全で、目立った速度の違いが発生しないため、これを使用してください


まったく悪い解決策ではありません。関連付けられているセキュリティ上の欠陥を処理し$_REQUESTますが、同じスクリプトにどちらの方法でもアクセスできます(私の場合、同じスクリプトが異なる「アクション」で使用され、$ _ GETで問題ない場合もあれば、$が必要な場合もあります_POST(データの非表示/保護)。
Xandor

4

ハッカーが$ _POSTまたは$ _GETの値を上書きするCookieを設定できるため、セキュリティ上の懸念が伴います。機密データを扱う場合、$ _ REQUESTの使用はお勧めしません。– Xandor

場合によっては、の$_GET代わりに使用することはできません$_POST

いつ ??

  • ファイルをアップロードしたいとき。
  • URLにデータを表示しない場合。

GET送信する情報量にも制限があります。制限は約2000文字です。

他のことはあなたがを使用してデータを取得できない場合がほとんどないことです $_POST

いつ ?

  • データがURLで渡されるとき。

休憩サービス

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

使用に問題はありません$_REQUEST

ただし、これを行う方法は、$ _ SERVER ['REQUEST_METHOD']を明示的にチェックすることであり、GETで$ _POSTが空であることに依存しません。


1
を使用$_SERVER['REQUEST_METHOD']してスクリプトが呼び出されるかどうかを確認するためのの使用に関する良いアドバイス。しかし、何も問題$_REQUESTがないと言うことは100%真実ではありません。ハッカーが$ _POSTまたは$ _GET値をオーバーライドするCookieを設定できるため、セキュリティ上の懸念事項がいくつかあります。機密データを扱う場合は、の使用はお勧めしません$_REQUEST
Xandor

私は私の回答にあなたのコメントを追加しました。それはあなたに感謝する助けになります
パルチャブダ

3

$ _GETは、クエリ文字列またはURLから変数を取得します。>

$ _POSTは、(一般に)フォームなどのPOSTメソッドから変数を取得します。

$ _REQUESTは$ _GETと$ _POSTのマージであり、$ _ POSTは$ _GETをオーバーライドします。検証用の自己参照フォームで$ _REQUESTを使用すると便利です。


2
オーバーライドrequest_orderはCookieの値に依存しており、Cookieの値も含まれている可能性があります。そのため、この機能は信頼性が低く、便利な機能でもありません。
ジャック

1

2番目の方法は、より明確であるため、使用します。そうでなければ、変数がどこから来ているのかわかりません。

とにかくGETとPOSTの両方を確認する必要があるのはなぜですか?確かにどちらか一方を使用することはより意味があります。


1
これは以前に見たことがありますが、GET1つの項目(移動など)とPOST複数の項目(チェックボックスのあるフォーム)に使用されています。
フランツ

1

_GETまたは_POSTのみを使用します。私はコントロールすることを好みます。

OPのどちらのコードフラグメントについても、どのHTTPメソッドが使用されたかに関する情報を破棄するのが嫌いです。そして、その情報は入力サニタイズのために重要です。

たとえば、スクリプトがDBに入力されるフォームからデータを受け入れる場合、フォームはPOSTを使用することをお勧めします(べき等アクションに対してのみGETを使用します)。しかし、スクリプトがGETメソッドを介して入力データを受け取った場合、それは(通常)拒否されます。私にとって、このような状況は、誰かが何かを試みている兆候であるため、セキュリティ違反をエラーログに書き込む必要があるかもしれません。

OPのどちらのコードフラグメントでも、このサニタイズは不可能です。


実際、ページに何でも投稿する小さなページを書くのはとても簡単です。したがって、リファラーヘッダーの送信に依存していない限り、ポスト変数は取得変数よりも安全ではありません。$_POST
エクスプリシット

私は反対に何も言わなかった。私が言ったのは、HTMLフォームがPOSTを使用し、スクリプトがフォームのデータをGETを介して受信する場合、スクリプトはそれについて知り、両方のコブラの例のようにその事実を破棄しないことです。(ところで:リファラーも安全ではありません。)

1

私が使用するのは$_POST、その内容とは$_GET異なり、$_REQUEST影響を受けないためvariables_orderです。
いつ使用するか、$_POSTおよび$_GET実行する操作の種類によって異なります。サーバーから処理されるデータを変更する操作はPOSTリクエストを介して実行する必要がありますが、その他の操作はGETリクエストを介して実行する必要があります。たとえば、ユーザーアカウントを削除する操作は、ユーザーがリンクをクリックした後に直接実行しないでください。画像の表示はリンクから実行できます。


1

私はこれを使います

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

このステートメントは、$ _ REQUESTに複数のパラメーターがあるかどうかを検証します($ _REQUESTの最初のパラメーターは、必要なときに使用できる要求URIになります。一部のPHPパッケージは$ _GETを返さないため、$ _ GETで複数あるかどうかを確認します。デフォルトでは、$ _ POSTになります。


0

あなたは時期尚早に最適化しています。また、セキュリティ上の理由から、POSTする対象にGETを使用するかどうかについても十分に検討する必要があります。


3
GETよりもPO​​STの方が安全であることを人々に伝えようとしないでください。

私はしませんでした。ポイントは、「REQUESTを入力するだけの方がはるかに簡単」なため、それらの使用法には多少の考慮が必要であり、露骨に同じ意味で使用するべきではないということです。
Alex Brasetvik 2009

コブラが期待された方法を使用してデータが送信されたことを確認する必要があるという意味であれば、私は同意します。彼のコード例のいずれかは、そのようなテストを不可能にします。

0

これは醜いので、コードをライブでプッシュするときの最終的な解決策としてはお勧めしませんが、残りの関数を構築するときに、「キャッチオール」パラメーターグラバーを用意すると便利です。

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

コマンドラインパラメータやIDEからのデータを処理するために、クリエイティブに追加することもできます。特定のREST関数が何を実行するかを決定したら、その特定の呼び出しに適切なものを1つ選択して、デプロイバージョンに必要なものを確実に取得できます。これは、「REQUEST_METHOD」が設定されていることを前提としています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.