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


130

Bir adam Snipplr gönderimlerimden birini "saçmalık" olarak adlandırdı çünkü if ($_SERVER['REQUEST_METHOD'] == 'POST')bunun yerineif ($_POST)

İstek yöntemini kontrol etmek bana daha doğru geliyor çünkü gerçekten yapmak istediğim şey bu. İkisi arasında bazı operasyonel farklar var mı yoksa bu sadece bir kod netliği sorunu mu?


214
O adama berbat olduğunu söyle.
Vinko Vrsalovic

12
Burada olarak kullanmak ===yerine kullanmalısınız . ==0 == 'POST'
dave1010

5
$ _SERVER ["REQUEST_METHOD"], bazı PHP + Apache2 kurulumlarında HTTP GET istekleri için "POST" içerebilir. Benimki gibi. Ve ben buraya böyle geldim.
Tiberiu-Ionuț Stan

3
@ Tiberiu-IonuțStan Eğer bu doğruysa (ki buna inanmıyorum), bu çok ciddi bir hatadır. Bir PHP veya Apache hata raporuna bir bağlantı sağlayabilir misiniz? Yeniden üretme adımları? Olduğu gibi, sana inanmıyorum.
Mark Amery

1
@ dave1010 Numara neden $_SERVER['REQUEST_METHOD']hiç 0? Bildiğim kadarıyla bu imkansız.
Mark Amery

Yanıtlar:


169

Aslında aynı şeyi yapmıyorlar.

$_SERVER['REQUEST_METHOD'] istek yöntemini (sürpriz) içerir.

$_POST herhangi bir gönderi verisi içerir.

Bir POST isteğinin POST verisi içermemesi mümkündür.

İstek yöntemini kontrol ediyorum - aslında $_POSTdiziyi test etmeyi hiç düşünmemiştim . Yine de gerekli posta alanlarını kontrol ediyorum. Dolayısıyla boş bir gönderi isteği, kullanıcıya birçok hata mesajı verir - bu benim için mantıklı.


Teorik olarak, istek yönteminin 'post' (küçük veya hatta karışık durum) olması mümkün olabilir. PHP, GET ve POST'ta bunu otomatik olarak temizliyor mu?
Boldewyn

Kısa bir testten sonra, WinXP üzerindeki PHP 5.2 açıkça bunu yapmıyor, bu yüzden muhtemelen istek_yöntemi yalnızca büyük harfe dönüştürülmelidir.
Boldewyn

3
@Boldewyn Hayır, değil, ancak müşteri size bir POST isteği gerçekleştirmeyi planladığında 'post' veya 'Post' istek yöntemi gönderirse, HTTP yöntemleri büyük / küçük harfe duyarlı olduğundan, bu özelliği ihlal ediyor demektir Spesifikasyona ve spesifikasyona göre, örneğin post veya Post veya pOsT yöntemini değil, yalnızca POST yöntemini tanımlar. Buradaki cevabımda bununla ilgili daha fazla ayrıntıya giriyorum: stackoverflow.com/a/21511879/1709587 . Özelliği ihlal eden istemci kodunu işlemek için yöntemi büyük harfe zorlamak isteyip istemediğiniz sizin seçiminizdir.
Mark Amery

Ve aynı şey olmadıklarından, onları farklı şeyler için kullanmamız mantıklı geliyor - yük yazın ve isteyin. Acaba bu kimseyi kusmuyor mu: Ne yaptığımızı anlamak için $ _SERVER ['REQUEST_METHOD'] kullanıyorum ve kavramlar arasında biraz bağımsızlık sağlayan yüke erişmek için $ _REQUEST kullanıyorum (diğer bir deyişle, nadiren $ _POST veya $ _GET kullanın).
grantwparks

@grantwparks Kulağa kötü bir anlaşma gibi geliyor. $ _GET ve $ _POST, verilerin nereye taşındığıyla daha çok ilgilidir. Şunu göz önünde bulundurun: "curl -k -L -X POST -H 'İçerik-Türü: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" "test" değeri doldurulur Yöntem POST olsa bile $ _GET.
txyoji

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') doğru yoldur, herhangi bir gönderi verisi olmadan gönderi isteği gönderebilirsiniz.


17

Daha $_POSTbüyük POST verileri ve yüklenen dosyalarla sorun yaşayana kadar kontrol ederdim. Yapılandırma yönergeleri vardır post_max_sizeve upload_max_filesize- bunlardan herhangi biri aşılırsa,$_POST dizi doldurulmaz.

Yani "güvenli yol" kontrol etmektir $_SERVER['REQUEST_METHOD']. Yine de isset()her $_POSTdeğişken üzerinde kullanmak zorundasınız ve kontrol etseniz de kontrol etmeseniz de önemli değil $_SERVER['REQUEST_METHOD'].


9

Uygulamanızın gönderi türü talebi üzerine yanıt vermesi gerekiyorsa, şunu kullanın:

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
}

Uygulamanızın istek sonrası alınan herhangi bir veriye tepki vermesi gerekiyorsa, şunu kullanın:

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

Uygulamaya özeldir, ancak her ikisini de kullanacaksınız, + $ _FILES süper küresel.


3

İkisi de doğru. Kişisel olarak, yaklaşımınızı ayrıntı için daha çok tercih ediyorum ama gerçekten kişisel tercihinize bağlı.

Elbette, eğer ($ _ POST) hata vermezse çalıştırılır - istek POST başlıklarıyla gönderilmiş olsa da $ _POST dizisi mevcuttur. Boole kontrolünde boş bir dizi false değerine dönüştürülür.


belki 2009'da, ama boş bir dizi! = false
clockw0rk

1
"Cast" kelimesini kaçırmış olabilirsiniz. Bir "if" yapısının içindeki ifade bir boolean'a dönüştürülür ve boş bir dizi böylece boolean false'a dönüştürülür. 2020'de bile
Eran Galperin

lol, haklısın. +1
clockw0rk

3

Çoğu tarayıcıda enter tuşuna basarak (yani gönder düğmesine tıklamadan) bir form gönderebilirsiniz, ancak bu bir değişken olarak gönder göndermeyebilir - bu nedenle boş bir form göndermek mümkündür, yani $_POSTboş olacaktır ancak form yine de php sayfasına bir http gönderi isteği oluşturdu. Bu durumda if ($_SERVER['REQUEST_METHOD'] == 'POST')daha iyi.


1
Bu durumda $_POSTboş olmaz: boş değerlere sahip bir dizi olur.
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
Cevabınız doğru olsa da, açıklama yapılmadan yardımcı olmaz! Lütfen Nasıl Cevap Verilir'e bir göz atın ! Teşekkür ederim!
jkalden

0

PHP betiklerime birden fazla yöntemle erişmem gerekebileceği sürece, aslında yaptığım şey:

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

-1

Sayfanın POST yoluyla çağrılıp çağrılmadığını kontrol eder (GET, HEAD vb. Yerine). Menü çubuğuna bir URL yazdığınızda, sayfa GET aracılığıyla çağrılır. Bununla birlikte, method = "post" ile bir form gönderdiğinizde, eylem sayfası POST ile çağrılır.


-3

Gerçekten altıda biri, diğer durumdan yarım düzine.

Yaklaşımınıza karşı mümkün olan tek argüman $ _SERVER ['REQUEST_METHOD'] == 'POST' belirli web sunucularında / yapılandırmada doldurulamayabilir, oysa $ _POST dizisi her zaman PHP4 / PHP5'te bulunur (ve değilse ' yok, daha büyük sorunlarınız var (- :)


-17

İkisi de aynı şekilde çalışır, ancak $_POSTdaha temiz olduğu için kullanılmalıdır. Var isset()olup olmadığını kontrol etmek için ekleyebilirsiniz .


6
$_POSTboş da olsa (boolean'a çevrilir false) her zaman var olacaktır . Ve "temizlikçi" ile ne demek istiyorsun?
TRiG

2
belki klavyede yazmak için daha az karakter gerektiğini kastetti = P
Julian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.