Некоторый парень назвал один из моих «Snapplr» «crap», потому что я использовал if ($_SERVER['REQUEST_METHOD'] == 'POST')
вместо if ($_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()
к нему, чтобы проверить его существование.