Isset ($ _ POST ['submit']) vs $_SERVER ['REQUEST_METHOD'] == 'POST'

Я столкнулся с скриптами, которые используют:

isset($_POST['submit'])

а также код, который использует:

$_SERVER['REQUEST_METHOD']=='POST'

Мне было интересно узнать разницу между этими двумя и какой метод лучше всего.

Ответ 1

Это означают две разные вещи. Во-первых, проверяет, была ли передана форма отправки параметра submit. Многие используют этот фрагмент, чтобы проверить, была ли отправлена ​​форма. Это работает, потому что кнопка отправки технически является <input>, поэтому оно отправляется вместе с любыми другими элементами, которые были частью формы.

<?php
    if(isset($_POST['submit'])) { // This way form and form logic can be adjacent to each other
        // Logic
    }
?>
<form method='POST' action='<?= $_SERVER['REQUEST_URI'] ?>'>
   <!--- other form stuff -->
   <input type="submit" name="submit" value="Send!" />
</form>

Второй фрагмент проверяет, была ли форма отправлена ​​методом POST. Это не обязательно означает, что кнопка формы была нажата. Если он не был отправлен с POST, тогда суперглобал $_POST будет пустым.

Ответ 2

isset($_POST['submit']) 

Если вы уже знаете, что определенное значение всегда будет отправлено и, следовательно, указывает на ожидаемую отправку формы (поле submit в этом случае), этот код скажет вам две вещи:

  • Форма отправляется с помощью метода POST, в отличие от GET, PUT и т.д.
  • Поле submit прошло.

$_SERVER['REQUEST_METHOD'] == 'POST'

Это говорит вам ровно одну вещь, форма была отправлена ​​с помощью метода POST. Причины его использования включают:

  • Вы хотите различать недопустимую отправку формы (например, не все поля были переданы) и другие виды поиска страниц (GET, PUT и т.д.)
  • Вы точно не знаете, что собираетесь получить. Возможно, этот код запускается в контроллере, который не знает всех деталей своих зависимых частей.

Первая

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!isset($_POST['name'])) {
        // at this point you know that `name` was not passed as part of the request
        // this could be treated as an error
    }
}

Versus:

if (!isset($_POST['name'])) {
    // the `name` field was not passed as part of the request
    // but it might also be a GET request, in which case a page should be shown
}

Внимание!

Проверка поля кнопки отправки в запросе ненадежна, так как форма может быть представлена ​​другими способами (например, нажатием Enter в текстовом поле).


$_POST

Просто используя это выражение, вы можете утверждать, что:

  • Форма отправляется через POST
  • По крайней мере одно поле отправлено

Ответ 3

Они делают разные вещи.

Первая проверяет, установлен ли ключ (submit) в массиве $_POST.

Вторая проверяет, является ли значение ключа в массиве $_SERVER 'POST'. Я предполагаю, что это можно было бы использовать, чтобы определить, были ли данные отправлены с использованием метода "получить" или "пост", но обычно вам не нужен только тот метод, который использовался, а скорее, какие данные были отправлены.

Что вы пытаетесь сделать?

Ответ 4

Первый оператор проверяет, был ли метод запроса Post и был ли запрос включен значением для элемента submit. Второй метод проверяет только, был ли метод запроса Post.

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