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

130

Jakiś facet nazwał jedną z moich propozycji Snipplra „bzdurą”, ponieważ if ($_SERVER['REQUEST_METHOD'] == 'POST')zamiast tego użyłemif ($_POST)

Sprawdzanie metody żądania wydaje mi się bardziej poprawne, ponieważ tak naprawdę chcę zrobić. Czy jest jakaś różnica operacyjna między nimi, czy jest to tylko kwestia przejrzystości kodu?

Scott
źródło
215
Powiedz temu facetowi, że jest do bani.
Vinko Vrsalovic,
12
Powinieneś użyć ===zamiast ==tutaj jako 0 == 'POST'.
dave1010
5
$ _SERVER ["REQUEST_METHOD"] może zawierać "POST" dla żądań HTTP GET w niektórych instalacjach PHP + Apache2. Jak moje. I tak się tu dostałem.
Tiberiu-Ionuț Stan
3
@ Tiberiu-IonuțStan Jeśli to prawda (w co nie wierzę), jest to bardzo poważny błąd. Czy możesz podać link do raportu o błędzie PHP lub Apache? Kroki ku reprodukcji? W obecnej sytuacji po prostu ci nie wierzę.
Mark Amery,
1
@ dave1010 Dlaczego miałby $_SERVER['REQUEST_METHOD']być numer 0? O ile wiem, to niemożliwe.
Mark Amery,

Odpowiedzi:

170

Cóż, tak naprawdę nie robią tego samego.

$_SERVER['REQUEST_METHOD'] zawiera metodę żądania (niespodzianka).

$_POST zawiera dane postów.

Żądanie POST może nie zawierać danych POST.

Sprawdzam metodę żądania - właściwie nigdy nie myślałem o przetestowaniu $_POSTtablicy. Sprawdzam jednak wymagane pola postów. Więc puste żądanie wpisu dałoby użytkownikowi wiele komunikatów o błędach - co dla mnie ma sens.

gnud
źródło
Teoretycznie może się zdarzyć, że metoda żądania to „post” (małe lub nawet mieszane litery). Czy PHP automatycznie czyści to w GET i POST?
Boldewyn
Po krótkim teście moje PHP 5.2 na WinXP oczywiście tego nie robi, więc prawdopodobnie metoda request_method powinna być oczyszczona tylko z wielkich liter.
Boldewyn
3
@Boldewyn Nie, nie jest, ale jeśli klient wysyła metodę żądania „post” lub „post”, gdy zamierza wykonać żądanie POST, to narusza specyfikację, ponieważ metody HTTP uwzględniają wielkość liter zgodnie ze specyfikacją, a specyfikacja określa tylko metodę POST, a nie np. metodę post lub Post lub pOsT. Bardziej szczegółowo omawiam to w mojej odpowiedzi tutaj: stackoverflow.com/a/21511879/1709587 . To, czy chcesz zmienić metodę na wielkie litery, aby obsłużyć kod klienta naruszający specyfikację, zależy od Ciebie.
Mark Amery,
A ponieważ nie są tym samym, sensowne jest, abyśmy mogli ich używać do różnych celów - wpisywania i żądania ładunku. Zastanawiam się, czy to sprawia, że ​​ktoś traci: używam $ _SERVER ['REQUEST_METHOD'], aby dowiedzieć się, co robimy, i używam $ _REQUEST, aby uzyskać dostęp do ładunku, który zachowuje pewną niezależność między koncepcjami (innymi słowy, ja rzadko używają konkretnie $ _POST lub $ _GET).
grantwparks
@grantwparks To brzmi jak zły interes. $ _GET i $ _POST mają więcej wspólnego z tym, gdzie dane zostały przetransportowane. Rozważ: „curl -k -L -X POST -H 'Content-Type: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" Wartość „test” zostanie zapełniona $ _GET, mimo że metoda to POST.
txyoji
40

if ($_SERVER['REQUEST_METHOD'] == 'POST') jest prawidłowy sposób, możesz wysłać prośbę o wpis bez żadnych danych.

stuartloxton
źródło
18

Sprawdzałem, $_POSTdopóki nie miałem problemów z większymi danymi POST i przesłanymi plikami. Istnieją dyrektywy konfiguracyjne post_max_sizei upload_max_filesize- jeśli którakolwiek z nich zostanie przekroczona, $_POSTtablica nie jest zapełniana.

Zatem „bezpiecznym sposobem” jest sprawdzenie $_SERVER['REQUEST_METHOD']. Nadal jednak musisz używać isset()na każdej $_POSTzmiennej i nie ma znaczenia, czy sprawdzasz, czy nie $_SERVER['REQUEST_METHOD'].

binaryLV
źródło
10

Jeśli Twoja aplikacja wymaga odpowiedzi na żądanie typu post, użyj tego:

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
}

Jeśli Twoja aplikacja wymaga reakcji na jakiekolwiek dane otrzymane pocztą, użyj tego:

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
   // ...
}

Jest to specyficzne dla implementacji, ale zamierzasz użyć obu + $ _FILES superglobal.

DUzun
źródło
3

Obie mają rację. Osobiście wolę twoje podejście lepiej ze względu na jego szczegółowość, ale tak naprawdę zależy to od osobistych preferencji.

Odręcznie, uruchomienie if ($ _ POST) nie spowodowałoby błędu - tablica $ _POST istnieje niezależnie od tego, czy żądanie zostało wysłane z nagłówkami POST. Pusta tablica jest rzutowana na fałsz w kontroli logicznej.

Eran Galperin
źródło
może w 2009 roku, ale pusta tablica! = false
clockw0rk
1
Mogłeś przegapić słowo „obsada”. Instrukcja wewnątrz struktury „if” jest rzutowana na wartość logiczną, a pusta tablica jest w ten sposób rzutowana na wartość logiczną fałsz. Nawet w 2020 roku
Eran Galperin
3

Możesz przesłać formularz, naciskając klawisz Enter (tj. Bez klikania przycisku przesyłania) w większości przeglądarek, ale niekoniecznie wysyła to jako zmienną - więc jest możliwe wysłanie pustego formularza, tj. $_POSTBędzie pusty, ale formularz nadal będzie wygenerował żądanie posta http na stronę php. W tym przypadku if ($_SERVER['REQUEST_METHOD'] == 'POST')jest lepiej.

Eamon
źródło
1
W takim przypadku $_POSTnie byłoby puste: byłaby to tablica z pustymi wartościami.
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");
    }
}
Amama Alaeddine
źródło
4
Chociaż twoja odpowiedź może być poprawna, nie jest pomocna bez wyjaśnienia! Zobacz, jak odpowiedzieć ! Dziękuję Ci!
jkalden
0

Tak długo, jak mogę potrzebować dostępu do moich skryptów PHP za pomocą więcej niż jednej metody, tak naprawdę robię to:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}
Alfredo Rahn
źródło
-1

Sprawdza, czy strona została wywołana przez POST (w przeciwieństwie do GET, HEAD itp.). Po wpisaniu adresu URL w pasku menu strona jest wywoływana przez GET. Jednak gdy wysyłasz formularz z method = "post", strona akcji jest wywoływana z POST.

shreekanth
źródło
-3

To naprawdę 6 z jednego, pół tuzina innej sytuacji.

Jedynym możliwym argumentem przeciwko twojemu podejściu jest $ _SERVER ['REQUEST_METHOD'] == 'POST' może nie być wypełnione na niektórych serwerach internetowych / w niektórych konfiguracjach, podczas gdy tablica $ _POST zawsze będzie istnieć w PHP4 / PHP5 (a jeśli tak nie jest ' nie istnieje, masz większe problemy (- :)

Alan Storm
źródło
-17

Oba działają w ten sam sposób, ale $_POSTpowinny być używane, ponieważ są czystsze. Możesz isset()do niego dodać , aby sprawdzić, czy istnieje.

Alex UK
źródło
6
$_POSTbędzie istnieć zawsze, chociaż może być pusty (co jest rzutowane na wartość logiczną false). A co masz na myśli mówiąc „czystsze”?
TRiG
2
może chodziło mu o to, że potrzeba mniej znaków do wpisania na klawiaturze = P
Julian