$ _POSTと$ _SERVER ['REQUEST_METHOD'] == 'POST'


130

私のif ($_SERVER['REQUEST_METHOD'] == 'POST')代わりに使用したため、誰かが私のSnipplr提出物の1つを「がらくた」と呼びましたif ($_POST)

それが私が本当にやりたいことなので、リクエストメソッドをチェックすることは私にとってより正しいようです。2つの間に操作上の違いはありますか、これは単なるコードの明確性の問題ですか?


214
彼が吸うその男を教えてください。
Vinko Vrsalovic、2009年

12
ここでは===なく==として使用する必要があります0 == 'POST'
dave1010 2013

5
$ _SERVER ["REQUEST_METHOD"]には、一部のPHP + Apache2インストールでのHTTP GETリクエストの「POST」が含まれる場合があります。私のもののように。そして、これは私がここに着いた方法です。
Tiberiu-Ionuț Stan 2013

3
@ Tiberiu-IonuțStanそれが真実であると私は信じていますが)、それは非常に深刻なバグです。PHPまたはApacheのバグレポートへのリンクを提供できますか?再現する手順?現状では、私はあなたを信じていません。
Mark Amery 2014年

1
@ dave1010なぜ$_SERVER['REQUEST_METHOD']その数になるの0でしょうか?私の知る限り、それは不可能です。
Mark Amery 2014年

回答:


169

まあ、彼らは実際には同じことをしません。

$_SERVER['REQUEST_METHOD'] リクエストメソッド(サプライズ)が含まれています。

$_POST 投稿データが含まれています。

POSTリクエストにPOSTデータが含まれていない可能性があります。

リクエストメソッドを確認しました$_POST。実際に配列をテストすることは考えていません。ただし、必要な投稿フィールドを確認します。したがって、空のPOSTリクエストは、ユーザーに多くのエラーメッセージを表示します。これは私には理にかなっています。


理論的には、リクエストメソッドが 'post'(小文字または大文字と小文字の混合)である可能性があります。PHPはGETおよびPOST時にこれを自動的にサニタイズしますか?
Boldewyn 2010年

簡単なテストの後、WinXP上のPHP 5.2は明らかにそれを実行しないため、おそらくrequest_methodは大文字のみにサニタイズする必要があります。
Boldewyn 2010年

3
@Boldewynいいえ、そうではありませんが、クライアントがPOSTリクエストを実行するつもりであるときに、クライアントが 'post'または 'Post'のリクエストメソッドを送信した場合、HTTPメソッドは大文字と小文字を区別するため、仕様に違反します。仕様に従って、仕様はPOSTメソッドのみを定義します。たとえば、post、Post、pOsTメソッドは定義しません。私はここで私の答えでこの詳細について詳しく説明します:stackoverflow.com/a/21511879/1709587。仕様に違反するクライアントコードを処理するためにメソッドを大文字に強制するかどうかは、あなたの選択です。
Mark Amery 2014年

また、それらは同じものではないため、タイプやリクエストペイロードなど、さまざまな用途に使用することができます。これは誰にもバーフを作るのだろうか:私は$ _SERVER ['REQUEST_METHOD']を使用して何をしているのかを理解し、$ _ REQUESTを使用してペイロードにアクセスします。これにより、概念間のわずかな独立性が維持されます$ _POSTまたは$ _GETを使用することはめったにありません)
grantwparks 2014

@grantwparksそれは悪い取引のように聞こえます。$ _GETと$ _POSTは、データが転送された場所とさらに関係があります。「curl -k -L -X POST -H 'Content-Type:text / csv' --data-binary \ @ sample.csv 'test-script.php?test = 12345'」という値を検討してください。メソッドがPOSTであっても$ _GET。
txyoji 2016年

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') 正しい方法です。投稿データなしで投稿リクエストを送信できます。


17

以前は$_POST、より大きなPOSTデータとアップロードされたファイルで問題が発生するまでチェックしていました。そこ設定ディレクティブはあるpost_max_sizeupload_max_filesize-それらのいずれかを超えた場合、$_POST配列は移入されません。

したがって、「安全な方法」はをチェックすること$_SERVER['REQUEST_METHOD']です。ただし、isset()すべての$_POST変数で使用する必要があり、チェックするかしないかは関係ありません$_SERVER['REQUEST_METHOD']


9

アプリケーションがタイプpostのリクエストに反応する必要がある場合は、これを使用します。

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { // if form submitted with post method
    // validate request, 
    // manage post request differently, 
    // log or don't log request,
    // redirect to avoid resubmition on F5 etc
}

アプリケーションがpostリクエストで受信したデータに反応する必要がある場合は、これを使用します。

if(!empty($_POST)) {  // if received any post data
   // process $_POST values, 
   // save data to DB,
   // ... 
}

if(!empty($_FILES)) { // if received any "post" files
   // validate uploaded FILES
   // move to uploaded dir
   // ...
}

これは実装固有ですが、両方を使用することになります+ $ _FILESスーパーグローバル。


3

どちらも正しいです。個人的には私はその冗長性のためにあなたのアプローチを好むが、それは本当に個人的な好みにかかっている。

手元では、if($ _ POST)を実行してもエラーはスローされません-$ _POST配列は、リクエストがPOSTヘッダー付きで送信されたかどうかに関係なく存在します。空の配列はブール値チェックでfalseにキャストされます。


2009年かもしれませんが、空の配列!= false
clockw0rk

1
「キャスト」という単語を見逃したかもしれません。「if」構造内のステートメントはブール値にキャストされるため、空の配列はブール値falseにキャストされます。2020年でも
Eran Galperin

笑、そうだね。+1
clockw0rk

3

ほとんどのブラウザでEnterキーを押すことで(つまり、[送信]ボタンをクリックせずに)フォームを送信できますが、必ずしも送信を変数として送信するわけではないため、空のフォームを送信することができ$_POSTます。 phpページへのhttp投稿リクエストを生成しました。この場合if ($_SERVER['REQUEST_METHOD'] == 'POST')はより良いです。


1
その場合、$_POST空ではありません。空の値を持つ配列になります。
TRiG 2010

0
$this->method = $_SERVER['REQUEST_METHOD'];
if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {
    if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {
        $this->method = 'DELETE';
    } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {
        $this->method = 'PUT';
    } else {
        throw new Exception("Unexpected Header");
    }
}

4
あなたの答えは正しいかもしれませんが、説明なしでは役に立ちません!回答方法をご覧ください!ありがとうございました!
jkalden 2017

0

複数の方法でPHPスクリプトにアクセスする必要がある場合、私が実際に行うことは次のとおりです。

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

-1

(GET、HEADなどではなく)POSTを通じてページが呼び出されたかどうかを確認します。メニューバーにURLを入力すると、ページはGETを通じて呼び出されます。ただし、me​​thod = "post"でフォームを送信すると、アクションページがPOSTで呼び出されます。


-3

それは実際には6の1、他の状況の半ダースです。

あなたのアプローチに対する唯一の可能な引数は$ _SERVER ['REQUEST_METHOD'] == 'POST'は特定のweb-servers / configurationに入力されないかもしれませんが、$ _ POST配列は常にPHP4 / PHP5に存在します(それが存在する場合)存在します、より大きな問題があります(-:)


-17

どちらも同じように$_POST機能しますが、よりクリーンなので使用する必要があります。isset()これを追加して、存在を確認できます。


6
$_POST空の場合もありますが、常に存在します(booleanにキャストされますfalse)。そして、「クリーナー」とはどういう意味ですか?
TRiG 2010

2
多分彼は、キーボードでタイプするのに必要な文字がより少ないことを意味した= P
Julian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.