$ _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()
к нему, чтобы проверить его существование.