$ _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?


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.


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.


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'].


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.


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.


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.


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

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 
}

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


-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 (- :)


-17

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.