$ Post и $ сервер['метод запроса'] == 'пост'


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

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

10 113
php

10 ответов:

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

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

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

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

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

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

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

таким образом, "безопасный способ" - это проверить $_SERVER['REQUEST_METHOD']. Вы все равно должны использовать isset() на каждые $_POST переменная, хотя, и это не имеет значения, проверяете ли вы или не проверяете $_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
}

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

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

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

Off hand, запуск 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");
    }
}

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

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

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

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