if ($_SERVER['REQUEST_METHOD'] == 'POST')
の代わりにif ($_POST)
を使用したため、Snipplrの送信の1つを「がらくた」と呼ぶ人がいました。
リクエストメソッドを確認することは、私にとって本当に正しいことだからです。 2つの間に操作上の違いはありますか、またはこれは単なるコードの明瞭さの問題ですか?
まあ、彼らは本当に同じことをしません。
$_SERVER['REQUEST_METHOD']
には要求メソッドが含まれています(サプライズ)。
$_POST
には投稿データが含まれます。
POSTリクエストにPOSTデータが含まれない可能性があります。
リクエストメソッドをチェックします—実際に$_POST
配列をテストすることを考えたことはありません。ただし、必要な投稿フィールドを確認します。したがって、空の投稿要求はユーザーに多くのエラーメッセージを与えることになります-これは理にかなっています。
if ($_SERVER['REQUEST_METHOD'] == 'POST')
は正しい方法です。投稿データなしで投稿リクエストを送信できます。
以前は、POSTのより大きなデータとアップロードされたファイルで問題が発生するまで$_POST
を確認していました。構成ディレクティブpost_max_size
およびupload_max_filesize
があります-これらのいずれかを超えた場合、$_POST
配列は取り込まれません。
したがって、「安全な方法」は$_SERVER['REQUEST_METHOD']
を確認することです。ただし、$_POST
変数ごとにisset()
を使用する必要があり、$_SERVER['REQUEST_METHOD']
をチェックするかどうかは関係ありません。
アプリケーションがタイプ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スーパーグローバルを使用します。
どちらも正しいです。個人的には、その冗長性のためにあなたのアプローチを好むが、それは本当に個人的な好みに依存している。
一方で、if($ _ POST)を実行してもエラーはスローされません。リクエストがPOSTヘッダーで送信されたかどうかにかかわらず、$ _ POST配列は存在します。空の配列は、ブールチェックでfalseにキャストされます。
$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");
}
}