Memeriksa apakah formulir telah dikirimkan - PHP

122

Apa cara terbaik untuk memeriksa apakah formulir telah dikirimkan atau tidak untuk menentukan apakah saya harus meneruskan variabel formulir ke kelas validasi saya?

Pertama saya pikir mungkin:

isset($_POST)

Tapi itu akan selalu kembali benar karena superglobal didefinisikan di mana-mana. Saya tidak ingin mengulang setiap elemen formulir saya dengan:

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

Saat menulis pertanyaan ini, saya memikirkan solusi yang jauh lebih mendasar, tambahkan bidang tersembunyi untuk bertindak sebagai bendera yang dapat saya periksa.

Apakah ada cara yang 'lebih bersih' untuk melakukannya selain menambahkan bendera saya sendiri?

Anonim
sumber
4
Nah, Anda bisa membuat tombol submit yang memiliki nama tertentu, seperti submiteddan kemudian menggunakan php if(isset($_POST['submited']))atau input tersembunyi ...
Max Allan
2
Anda harus menambahkan nounce untuk mencegah serangan replay pada formulir Anda.
hakre

Jawaban:

191

Untuk pemeriksaan umum apakah ada POSTpenggunaan tindakan:

if (!empty($_POST))

EDIT : Seperti yang dinyatakan dalam komentar, metode ini tidak akan berfungsi untuk beberapa kasus (misalnya dengan kotak centang dan tombol tanpa nama). Anda benar-benar harus menggunakan:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
matino
sumber
168

Bagaimana tentang

if($_SERVER['REQUEST_METHOD'] == 'POST')
Olaf
sumber
69

Sebenarnya, tombol kirim sudah menjalankan fungsi ini.

Coba dalam FORMULIR:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

Kemudian di handler PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
sumber
6
Ini jawaban yang benar. Hanya memeriksa $ _POST saja tidak cukup baik karena bisa saja dibuat dari sejumlah tempat berbeda ... tidak hanya dari kiriman formulir. Terima kasih Tzshand.
Houston
Idealnya sekarang Anda harus menggunakan if (null !== (filter_input(INPUT_POST, 'macaddress'))){yang membuat Anda terbiasa menggunakan filter_input
depicus
2
POST dapat dilakukan dengan Ajax, yang tidak memiliki tombol kirim, jadi ini bukan solusi universal.
Muhammad bin Yusrat
Itu benar; itu juga dapat memeriksa variabel apa pun yang diposting oleh AJAX.
Tzshand
34

Menggunakan

if(isset($_POST['submit'])) // name of your submit button
Rikesh
sumber
1
Solusi paling sederhana. Semua formulir harus memiliki tombol kirim!
Anh Tran
1
Tetapi beberapa formulir mungkin memiliki banyak tombol.
Progrock
2
@rilwis terkadang formulir dikirim oleh JavaScript dan tidak perlu / memiliki tombol kirim
Waqas Malik
28

if ($_SERVER['REQUEST_METHOD'] == 'POST').

CodeCaster
sumber
14

Coba ini

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }
Rizon
sumber
2
Metode ini adalah yang paling direkomendasikan, karena tampaknya dikenal sebagai "praktik terbaik" oleh "akademi pengkodean".
Darkeden
1

Pada catatan yang berbeda, selalu merupakan praktik yang baik untuk menambahkan token ke formulir Anda dan memverifikasinya untuk memeriksa apakah data tidak dikirim dari luar. Berikut langkah-langkahnya:

  1. Hasilkan token unik (Anda dapat menggunakan hash) Contoh:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Tetapkan token ini ke variabel sesi. Ex:

    $_SESSION['form_token'] = $token;
  3. Tambahkan masukan tersembunyi untuk mengirimkan token. Ex:

    input type="hidden" name="token" value="{$token}"
  4. kemudian sebagai bagian dari validasi Anda, periksa apakah token yang dikirimkan cocok dengan sesi var.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
Profesor
sumber
0

Saya memiliki masalah yang sama - pastikan juga Anda menambahkan name=""tombol input. Nah, perbaikan itu berhasil untuk saya.

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">
Jen
sumber
-6

Anda juga bisa menggunakan:

is_array($_POST)
SW4
sumber
4
is_array($_POST)selalu memberikan true (di mesin saya). Menurut stackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehow, sehingga tampaknya diharapkan bahwa ini selalu mengembalikan benar ..
GitaarLAB
is_array($_POST)jelas bukan cara untuk memeriksa apakah formulir telah dikirim.
Lukas