$ _POST проти $ _SERVER ['REQUEST_METHOD'] == 'POST'


130

Якийсь хлопець назвав одне з моїх матеріалів Snipplr "лайна", тому що я використовував if ($_SERVER['REQUEST_METHOD'] == 'POST')замість цьогоif ($_POST)

Перевірка методу запиту здається мені більш правильною, тому що це я дійсно хочу зробити. Чи є якась робоча різниця між ними або це лише питання чіткості коду?


214
Скажи тому хлопцю, що він смокче.
Вінко Врсалович

12
Ви повинні використовувати ===замість ==тут як 0 == 'POST'.
dave1010

5
$ _SERVER ["REQUEST_METHOD"] може містити "POST" для HTTP GET-запитів у деяких установках PHP + Apache2. Як і моя. І ось як я потрапив сюди.
Tiberiu-Ionuț Stan

3
@ Tiberiu-IonuțStan Якщо це правда (в що я не вірю, що це так), це дуже серйозна помилка. Чи можете ви надати посилання на звіт про помилки PHP або Apache? Кроки до відтворення? Як це є, я просто не вірю тобі.
Марк Амері

1
@ dave1010 Чому б $_SERVER['REQUEST_METHOD']коли-небудь було число 0? Наскільки я знаю, це неможливо.
Марк Амері

Відповіді:


169

Ну, вони не роблять те саме, насправді.

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

$_POST містить будь-які дані про публікацію.

Запит POST може не містити даних POST.

Я перевіряю метод запиту - я насправді ніколи не думав про тестування $_POSTмасиву. Я перевіряю обов'язкові поля публікації. Тож запит на пусту пошту дасть користувачеві безліч повідомлень про помилки - що для мене є сенсом.


Теоретично можливо, що метод запиту є "повідомленням" (нижній або навіть змішаний регістр). PHP автоматично дезінфікує це на GET і POST?
Болдевін

Після короткого тестування, мій PHP 5.2 на WinXP, очевидно, не робить цього, тому, ймовірно, метод_програми повинен бути перероблений лише у верхній регістр.
Boldewyn

3
@Boldewyn Ні, це не так, але якщо клієнт надсилає вам метод запиту "повідомлення" або "Опублікувати", коли він має намір виконати запит POST, вони порушують специфікацію, оскільки методи HTTP відрізняються від регістру відповідно до специфікації та специфікація визначає лише метод POST, а не, наприклад, пост або метод повідомлення або pOsT. Більш детально про це я розбираюсь у своїй відповіді тут: stackoverflow.com/a/21511879/1709587 . Незалежно від того, чи хочете ви примусити метод до великого регістру для обробки клієнтського коду, що порушує вимоги, це ваш вибір.
Марк Амері

А оскільки вони не одне і те ж, є сенс, що ми можемо використовувати їх для різних речей - введіть і запитайте корисну навантаження. Цікаво, чи це робить когось барфу: я використовую $ _SERVER ['REQUEST_METHOD'], щоб зрозуміти, що ми робимо, і я використовую $ _REQUEST для доступу до корисного навантаження, що підтримує невелику незалежність між поняттями (іншими словами, я рідко використовуйте спеціально $ _POST або $ _GET).
grantwparks

@grantwparks Це здається поганою справою. $ _GET і $ _POST мають більше спільного з тим, куди переносилися дані. Поміркуйте: "curl -k -L -X POST -H" Тип вмісту: text / csv '--дані-бінарні \ @ sample.csv' test-script.php? Test = 12345 '"Значення" тест "заповнюється $ _GET, хоча метод POST.
txyoji

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') це правильний спосіб, ви можете надіслати запит на публікацію без будь-яких даних про публікацію.


17

Я перевіряв, $_POSTпоки не зіткнувся з проблемою з більшими даними POST та завантаженими файлами. Існують директиви конфігурації post_max_sizeі upload_max_filesize- якщо будь-яка з них перевищена, $_POSTмасив не заповнюється.

Тож "безпечний спосіб" - це перевірка $_SERVER['REQUEST_METHOD']. Ви все ще повинні використовувати isset()кожну $_POSTзмінну, і не має значення, перевіряєте ви її чи не перевіряєте $_SERVER['REQUEST_METHOD'].


9

Якщо вашій програмі потрібно реагувати на запит типу публікації, використовуйте це:

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 суперглобальні.


3

Вони обидва вірні. Особисто я віддаю перевагу вашому підходу краще за його багатослівність, але це дійсно до особистих переваг.

З іншого боку, працює, якщо ($ _ POST) не призведе до помилки - масив $ _POST існує незалежно від того, чи було надіслано запит із заголовками POST. Порожній масив приведено до помилки в булевій чеку.


можливо, у 2009 році, але порожній масив! = false
clockw0rk

1
Можливо, ви пропустили слово "акторський склад". Заява всередині структури "якщо" передається булевій, а порожній масив таким чином передається в булева помилка. Навіть у 2020 році
Еран Гальперін

хаха, ур справа. +1
clockw0rk

3

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


1
У цьому випадку $_POSTне було б порожнім: це буде масив із порожніми значеннями.
TRiG

0
$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");
    }
}

4
Хоча ваша відповідь може бути правильною, вона не допомагає без пояснень! Будь ласка, подивіться, як відповісти ! Дякую!
jkalden

0

Поки мені може знадобитися доступ до моїх скриптів PHP більш ніж одним методом, я фактично це:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

-1

Він перевіряє, чи викликається сторінка через POST (на відміну від GET, HEAD тощо). Коли ви вводите URL в рядку меню, сторінка викликається через GET. Однак, коли ви надсилаєте форму з методом = "розмістити", сторінка дій викликається з POST.


-3

Це справді 6 з однієї, півдесятка іншої ситуації.

Єдиний можливий аргумент проти вашого підходу - $ _SERVER ['REQUEST_METHOD'] == 'POST' не може бути заповнений на певних веб-серверах / конфігураціях, тоді як масив $ _POST завжди буде існувати в PHP4 / PHP5 (і якщо він не ' t існують, у вас є більші проблеми (- :)


-17

Вони обидва працюють однаково, але їх $_POSTслід використовувати, оскільки це чистіше. Ви можете додати isset()до нього, щоб перевірити, чи існує.


6
$_POSTзавжди буде існувати, хоча він може бути порожнім (що передається булевим false). А що ви маєте на увазі під "чистішим"?
TRiG

2
можливо, він означав, що потрібно набрати менше символів на клавіатурі = P
Джуліан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.