$ _POST vs. $ _SERVER ['REQUEST_METHOD'] == 'POST'

130

Beberapa pria bernama salah satu dari kiriman Snipplr saya "omong kosong" karena saya menggunakan if ($_SERVER['REQUEST_METHOD'] == 'POST')bukannyaif ($_POST)

Memeriksa metode permintaan tampaknya lebih tepat bagi saya karena itulah yang benar-benar ingin saya lakukan. Apakah ada perbedaan operasional antara keduanya atau ini hanya masalah kejelasan kode?

Scott
sumber
214
Katakan pada pria itu bahwa dia payah.
Vinko Vrsalovic
12
Anda harus menggunakan ===alih-alih di ==sini sebagai 0 == 'POST'.
dave1010
5
$ _SERVER ["REQUEST_METHOD"] dapat berisi "POST" untuk permintaan GET HTTP pada beberapa instalasi PHP + Apache2. Seperti punyaku. Dan inilah bagaimana saya sampai di sini.
Tiberiu-Ionuț Stan
3
@ Tiberiu-IonuțStan Jika itu benar (yang saya tidak percaya), itu adalah bug yang sangat serius. Bisakah Anda memberikan tautan ke laporan bug PHP atau Apache? Langkah-langkah mereproduksi? Karena itu, aku hanya tidak percaya padamu.
Mark Amery
1
@ dave1010 Mengapa $_SERVER['REQUEST_METHOD']nomornya 0? Sejauh yang saya tahu, itu tidak mungkin.
Mark Amery

Jawaban:

169

Ya, mereka tidak melakukan hal yang sama, sungguh.

$_SERVER['REQUEST_METHOD'] berisi metode permintaan (kejutan).

$_POST berisi data pos apa pun.

Mungkin saja permintaan POST tidak mengandung data POST.

Saya memeriksa metode permintaan - Saya sebenarnya tidak pernah berpikir untuk menguji $_POSTarray. Saya memeriksa kolom posting yang diperlukan. Jadi permintaan posting yang kosong akan memberikan pengguna banyak pesan kesalahan - yang masuk akal bagi saya.

Agak
sumber
Secara teoritis, bisa saja, bahwa metode permintaan adalah 'posting' (huruf kecil atau bahkan campuran). Apakah PHP secara otomatis membersihkan ini pada GET dan POST?
Boldewyn
Setelah tes singkat, PHP 5.2 saya di WinXP jelas tidak melakukannya, jadi mungkin request_method harus disanitasi hanya untuk huruf besar.
Boldewyn
3
@Boldewyn Tidak, tidak, tetapi jika klien mengirimi Anda metode permintaan 'posting' atau 'Posting' ketika mereka bermaksud melakukan permintaan POST maka mereka melanggar spesifikasi, karena metode HTTP peka huruf besar-kecil menurut spec dan spec hanya mendefinisikan metode POST, bukan eg metode post atau Post atau pOsT. Saya membahas lebih detail tentang ini dalam jawaban saya di sini: stackoverflow.com/a/21511879/1709587 . Apakah Anda ingin memaksa metode untuk menggunakan huruf besar untuk menangani kode klien yang melanggar spesifikasi adalah pilihan Anda.
Mark Amery
Dan karena mereka bukan hal yang sama, masuk akal bahwa kita mungkin menggunakannya untuk hal yang berbeda - ketik dan minta payload. Saya bertanya-tanya apakah ini membuat siapa pun muntah: Saya menggunakan $ _SERVER ['REQUEST_METHOD'] untuk mengetahui apa yang kami lakukan, dan saya menggunakan $ _REQUEST untuk mengakses muatan, yang mempertahankan sedikit independensi antara konsep-konsep (dengan kata lain, saya jarang menggunakan $ _POST atau $ _GET secara khusus).
Grantwparks
@ grantwparks Kedengarannya seperti kesepakatan yang buruk. $ _GET dan $ _POST lebih terkait dengan tempat pengangkutan data. Pertimbangkan: "curl -k -L -X POST -H 'Content-Type: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" Nilai "test" terisi $ _DAPATKAN meskipun metodenya POST.
txyoji
37

if ($_SERVER['REQUEST_METHOD'] == 'POST') cara yang benar, Anda dapat mengirim permintaan posting tanpa data posting.

stuartloxton
sumber
17

Saya biasa memeriksa $_POSTsampai saya mendapat masalah dengan data POST yang lebih besar dan file yang diunggah. Ada arahan konfigurasi post_max_sizedan upload_max_filesize- jika ada yang terlampaui, $_POSTarray tidak terisi.

Jadi "cara aman" adalah memeriksa $_SERVER['REQUEST_METHOD']. Anda masih harus menggunakan isset()pada setiap $_POSTvariabel, dan itu tidak masalah, apakah Anda memeriksa atau tidak memeriksa $_SERVER['REQUEST_METHOD'].

binaryLV
sumber
9

Jika aplikasi Anda perlu bereaksi atas permintaan jenis tulisan, gunakan ini:

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
}

Jika aplikasi Anda perlu bereaksi terhadap data apa pun yang diterima melalui permintaan pos, gunakan ini:

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

Ini implementasi spesifik, tetapi Anda akan menggunakan keduanya, + $ _FILES superglobal.

DUzun
sumber
3

Keduanya benar. Secara pribadi saya lebih suka pendekatan Anda lebih baik karena verbositasnya tetapi itu benar-benar ke preferensi pribadi.

Secara otomatis, menjalankan if ($ _ POST) tidak akan menimbulkan kesalahan - array $ _POST ada terlepas jika permintaan dikirim dengan header POST. Array kosong dilemparkan ke false dalam pemeriksaan boolean.

Eran Galperin
sumber
mungkin pada tahun 2009, tetapi array kosong! = false
clockw0rk
1
Anda mungkin telah melewatkan kata "pemain". Pernyataan di dalam struktur "jika" dilemparkan ke boolean, dan array kosong dengan demikian dilemparkan ke boolean false. Bahkan pada tahun 2020
Eran Galperin
lol, kamu benar. +1
clockw0rk
3

Anda dapat mengirimkan formulir dengan menekan tombol enter (yaitu tanpa mengklik tombol kirim) di sebagian besar browser tetapi ini tidak selalu mengirim kirim sebagai variabel - jadi dimungkinkan untuk mengirimkan formulir kosong yaitu $_POSTakan kosong tetapi formulir akan tetap telah menghasilkan permintaan posting http ke halaman php. Dalam hal if ($_SERVER['REQUEST_METHOD'] == 'POST')ini lebih baik.

Eamon
sumber
1
Dalam hal ini, $_POSTtidak akan kosong: itu akan menjadi array dengan nilai kosong.
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
sumber
4
Meskipun jawaban Anda mungkin benar, itu tidak membantu tanpa penjelasan! Silakan lihat Cara Menjawab ! Terima kasih!
jkalden
0

Selama saya mungkin perlu mengakses skrip PHP saya dengan lebih dari satu metode, yang saya lakukan sebenarnya adalah:

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

Ia memeriksa apakah halaman telah dipanggil melalui POST (bukan GET, HEAD, dll). Saat Anda mengetik URL di bilah menu, halaman tersebut dipanggil melalui GET. Namun, ketika Anda mengirimkan formulir dengan metode = "posting" halaman tindakan disebut dengan POST.

pekik
sumber
-3

Ini benar-benar 6 dari satu, setengah lusin dari situasi lainnya.

Satu-satunya argumen yang mungkin menentang pendekatan Anda adalah $ _SERVER ['REQUEST_METHOD'] == 'POST' mungkin tidak diisi pada server-server / konfigurasi tertentu, sedangkan array $ _POST akan selalu ada di PHP4 / PHP5 (dan jika tidak t ada, Anda memiliki masalah yang lebih besar (- :)

Alan Storm
sumber
-17

Keduanya bekerja dengan cara yang sama, tetapi $_POSTharus digunakan karena lebih bersih. Anda dapat menambahkannya isset()untuk memeriksa keberadaannya.

Alex UK
sumber
6
$_POSTakan selalu ada, meskipun mungkin kosong (yang dilemparkan ke boolean false). Dan apa yang Anda maksud dengan "pembersih"?
TRiG
2
mungkin maksudnya lebih sedikit karakter yang diperlukan untuk mengetik di keyboard = P
Julian