$ _POST против $ _SERVER ['REQUEST_METHOD'] == 'POST' - PullRequest
120 голосов
/ 03 января 2009

Один парень назвал одно из моих представлений в Snipplr "дерьмом", потому что я использовал if ($_SERVER['REQUEST_METHOD'] == 'POST') вместо if ($_POST)

Проверка метода запроса кажется мне более правильной, потому что это то, что я действительно хочу сделать. Есть ли какая-то оперативная разница между ними или это просто проблема ясности кода?

Ответы [ 10 ]

156 голосов
/ 03 января 2009

Ну, на самом деле они не делают одно и то же.

$_SERVER['REQUEST_METHOD'] содержит метод запроса (сюрприз).

$_POST содержит любые почтовые данные.

Возможно, что запрос POST не содержит данных POST.

Я проверяю метод запроса - на самом деле я никогда не думал о тестировании массива $_POST. Я проверяю обязательные поля сообщения, хотя. Таким образом, пустой почтовый запрос дал бы пользователю много сообщений об ошибках - что имеет смысл для меня.

33 голосов
/ 03 января 2009

if ($_SERVER['REQUEST_METHOD'] == 'POST') - правильный путь, вы можете отправить запрос без каких-либо данных.

15 голосов
/ 22 марта 2010

Я проверял $_POST, пока не столкнулся с проблемой больших данных POST и загруженных файлов. Существуют директивы конфигурации post_max_size и upload_max_filesize - если превышено любое из них, массив $_POST не заполняется.

Таким образом, «безопасный способ» - проверить $_SERVER['REQUEST_METHOD']. Вы все равно должны использовать isset() для каждой переменной $_POST, и не имеет значения, проверяете ли вы или не проверяете $_SERVER['REQUEST_METHOD'].

7 голосов
/ 12 июня 2013

Если ваше приложение должно реагировать на запрос типа 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 superglobal.

3 голосов
/ 07 августа 2010

Вы можете отправить форму, нажав клавишу ввода (т. Е. Не нажимая кнопку отправки), в большинстве браузеров, но это не обязательно отправляет отправить как переменную - так что можно отправить пустую форму, т.е. $_POST будет пусто, но форма все равно сгенерирует запрос http на страницу php. В этом случае if ($_SERVER['REQUEST_METHOD'] == 'POST') лучше.

1 голос
/ 27 февраля 2017
$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 голос
/ 03 января 2009

Они оба верны. Лично я предпочитаю твой подход лучше из-за его многословия, но он действительно зависит от личных предпочтений.

От руки, если if ($ _ POST) не выдаст ошибку - массив $ _POST существует независимо от того, был ли запрос отправлен с заголовками POST. Пустой массив приведен к ложному в логической проверке.

0 голосов
/ 27 января 2014

Проверяет, была ли страница вызвана через POST (в отличие от GET, HEAD и т. Д.). Когда вы вводите URL в строке меню, страница вызывается через GET. Однако, когда вы отправляете форму с методом = "post", страница действия вызывается с POST.

0 голосов
/ 03 января 2009

Это действительно 6 из 1, полдюжины из другой ситуации.

Единственный возможный аргумент против вашего подхода - это $ _SERVER ['REQUEST_METHOD'] == 'POST' может не заполняться на определенных веб-серверах / конфигурации, тогда как массив $ _POST всегда будет существовать в PHP4 / PHP5 (и если это не существует, у вас есть большие проблемы (-:)

0 голосов
/ 03 января 2009

Они оба работают одинаково, но $_POST следует использовать, поскольку он чище. Вы можете добавить isset() к нему, чтобы проверить, что он существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...