$ Post и $ сервер['метод запроса'] == 'пост'
какой-то парень назвал одну из моих представлений Snipplr "дерьмом", потому что я использовал if ($_SERVER['REQUEST_METHOD'] == 'POST')
вместо if ($_POST)
проверка метода запроса кажется мне более правильным, потому что это то, что я действительно хочу сделать. Есть ли какая-то операционная разница между ними или это просто проблема ясности кода?
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 (и если он не существует, у вас есть большие проблемы (-:)