web-dev-qa-db-ja.com

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

if ($_SERVER['REQUEST_METHOD'] == 'POST')の代わりにif ($_POST)を使用したため、Snipplrの送信の1つを「がらくた」と呼ぶ人がいました。

リクエストメソッドを確認することは、私にとって本当に正しいことだからです。 2つの間に操作上の違いはありますか、またはこれは単なるコードの明瞭さの問題ですか?

122
Scott

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

$_SERVER['REQUEST_METHOD']には要求メソッドが含まれています(サプライズ)。

$_POSTには投稿データが含まれます。

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

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

159
gnud

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

33
stuartloxton

以前は、POSTのより大きなデータとアップロードされたファイルで問題が発生するまで$_POSTを確認していました。構成ディレクティブpost_max_sizeおよびupload_max_filesizeがあります-これらのいずれかを超えた場合、$_POST配列は取り込まれません。

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

16
binaryLV

アプリケーションがタイプ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
}

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

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スーパーグローバルを使用します。

7
DUzun

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

一方で、if($ _ POST)を実行してもエラーはスローされません。リクエストがPOSTヘッダーで送信されたかどうかにかかわらず、$ _ POST配列は存在します。空の配列は、ブールチェックでfalseにキャストされます。

1
Eran Galperin
$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");
    }
}
1
Amama Alaeddine