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?


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')

168

Bagaimana tentang

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

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

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

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


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'])){

    }

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

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

-6

Anda juga bisa menggunakan:

is_array($_POST)

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