$ _POST vs. $_SERVER ['REQUEST_METHOD'] == 'POST'

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

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

Ответ 1

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

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

$_POST содержит любые сообщения.

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

$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");
    }
}

Ответ 8

До тех пор, пока мне может понадобиться доступ к моим PHP-сценариям более чем одним методом, на самом деле я делаю следующее:

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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