$ _POST vs. $ _SERVER == 'POST'

Некоторый парень назвал один из моих «Snapplr» «crap», потому что я использовал if ($_SERVER['REQUEST_METHOD'] == 'POST') вместо if ($_POST)

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

Solutions Collecting From Web of "$ _POST vs. $ _SERVER == 'POST'"

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

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

$_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 } 

Если ваше приложение должно реагировать на любые данные, полученные по запросу, используйте это:

 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.

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

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

Выкл., Если 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. Однако, когда вы отправляете форму с методом = «post», страница действий вызывается с POST.

Это действительно одна из шести, одна полтора десятка другой ситуации.

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

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