Dua tombol kirim dalam satu bentuk

534

Saya memiliki dua tombol kirim dalam formulir. Bagaimana cara menentukan yang mana yang terkena sisi server?

Alex
sumber
Pertimbangkan untuk mengubah jawaban yang diterima menjadi jawaban Burung Beo .
Peter Mortensen
2
@PeterMortensen - Baik jawaban yang diterima maupun jawaban Parrot adalah yang terbaik hari ini. Lihat jawaban Leo untuk solusi HTML5 yang lebih baru menggunakan atribut formaction. Atau lihat jawaban kiril untuk bagaimana agar HTML dapat dilihat oleh pengguna terlepas dari nilai yang dikirim ke browser - menyelesaikan masalah internasionalisasi dengan cara yang lebih mudah dikodekan daripada jawaban Greg atau Parrot.
ToolmakerSteve

Jawaban:

448

Jika Anda memberi masing-masing nama, yang diklik akan dikirim sebagai input lainnya.

<input type="submit" name="button_1" value="Click me">
Greg
sumber
101
Pastikan juga nama tombol memiliki nama yang benar! Misalnya "tombol-1" TIDAK akan berfungsi. Mungkin menyelamatkan seseorang dari kerumitan jadi ingatlah ini.
pdolinaj
22
Biasanya, semua input dalam formulir dikirim dengan formulir. Karena nilai tombol dikirimkan hanya jika diklik, Anda harus mencari nilai formulir untuk nama yang telah ditentukan ini. Saya pikir jawaban lain ( stackoverflow.com/a/21778226/88409 ) yang melibatkan memberi mereka semua nama yang sama, dengan nilai yang berbeda, lebih masuk akal. Kemudian Anda hanya mengambil nilai di bawah satu nama bidang formulir yang dikenal. Ini juga membuatnya lebih jelas bahwa hanya satu nilai (yang diklik) akan dikirim untuk nama input yang diberikan, seperti cara kerja tombol radio (nama yang sama, nilai yang berbeda).
Triynko
6
@Triynko, seperti yang dikatakan Robin Green dalam komentar atas jawaban itu, yang ini lebih baik untuk internasionalisasi. Misalnya, jika halaman ditampilkan dalam bahasa Spanyol, teks dari tombol-tombol tersebut kemungkinan akan berbeda. Jadi memiliki logika kode Anda bergantung pada teks tombol yang akan pecah dalam kasus itu. Menggunakan nama lebih aman, karena ini adalah nilai yang tidak ditampilkan kepada pengguna dan karenanya dapat diperlakukan lebih sebagai variabel "pribadi" dan lebih sedikit sebagai pesan kepada pengguna.
sfarbota
Untuk mengklarifikasi komentar @ sfarbota: Solusi pertama yang ditunjukkan dalam jawaban Parrot bermasalah, karena bergantung pada pengujian nilai yang terlihat oleh pengguna . Itu meragukan - kode yang rusak ketika mengubah kata yang terlihat pengguna dianggap "rapuh". The kedua solusi ditampilkan dalam jawaban Parrot baik-baik saja - itu adalah sama seperti yang satu ini. Solusi kedua Parrot juga menunjukkan kode yang sesuai untuk ditulis, maka itu adalah jawaban yang lebih berguna daripada yang ini.
ToolmakerSteve
2
Lihat jawaban Leo untuk solusi HTML5 yang lebih baru menggunakan atribut formaction. Atau lihat jawaban Kiril untuk bagaimana agar HTML terlihat oleh pengguna tidak tergantung pada nilai yang dikirim ke browser - menyelesaikan masalah internasionalisasi.
ToolmakerSteve
875

Solusi 1:
Berikan masing-masing input nilai yang berbeda dan jaga nama yang sama:

<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />

Kemudian dalam pemeriksaan kode untuk melihat yang dipicu:

if ($_POST['action'] == 'Update') {
    //action for update here
} else if ($_POST['action'] == 'Delete') {
    //action for delete
} else {
    //invalid action!
}

Masalahnya adalah Anda mengikat logika Anda dengan teks yang dapat dilihat pengguna di dalam input.


Solusi 2:
Berikan masing-masing nama yang unik dan periksa $ _POST untuk keberadaan input itu:

<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />

Dan dalam kode:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}
Bayan
sumber
37
Untuk tujuan i18n, mungkin lebih baik menggunakan jawaban yang dipilih.
Robin Green
11
@LaszloPapp sebagaimana jawabannya sendiri mengatakan, jika Anda menggunakan jawaban yang dipilih di atas, Anda dapat menginternasionalkan formulir (yaitu menerjemahkan ke berbagai bahasa atau dialek) tanpa mempengaruhi logika. Jika Anda menggunakan opsi pertama dalam jawaban ini, logikanya tergantung pada bahasa tempat bentuk sebenarnya disajikan.
Robin Green
1
@RobinGreen: Saya pikir kebanyakan orang akan menggunakan logika kedua, bukan?
lpapp
5
i18n = i [nternationalizatio] n, dan 18 berarti 18 huruf antara yang pertama dan yang terakhir.
Buttle Butkus
18
OP tidak meminta PHP.
Rudey
110

Solusi yang lebih baik lagi terdiri dari menggunakan tag tombol untuk mengirimkan formulir:

<form>
    ...
    <button type="submit" name="action" value="update">Update</button>
    <button type="submit" name="action" value="delete">Delete</button>
</form>

HTML di dalam tombol (mis. ..>Update<..Adalah apa yang dilihat oleh pengguna; karena ada HTML yang disediakan, valuetidak terlihat oleh pengguna; hanya dikirim ke server. Dengan cara ini tidak ada ketidaknyamanan dengan internasionalisasi dan beberapa bahasa tampilan (dalam solusi sebelumnya, label tombol juga nilai yang dikirim ke server).

Kiril
sumber
13
Tampaknya perilaku peramban berbeda; beberapa mengirimkan atribut nilai, yang lain string di antara tag ... Jadi berhati-hatilah dengan yang ini.
Jeroen Dierckx
1
Saya pikir cuplikan yang disediakan didukung sepenuhnya ( w3schools.com/tags/att_button_type.asp )
kiril
2
@kiril cuplikan dari tautan itu menggunakan dua jenis <button>: submitdan reset. Perhatikan bahwa resettidak mengirimkan apa pun, itu hanya me-reset formulir. Jadi argumen Jeroen tetap ada.
fizruk
7
Oke, benar. Kemudian, saya memeriksa Draft Kerja HTML5 W3C. Mengutip: >> Atribut nilai memberikan nilai elemen untuk keperluan pengiriman formulir. Nilai elemen adalah nilai atribut nilai elemen, jika ada, atau string kosong sebaliknya. >> CATATAN: Tombol (dan nilainya) hanya disertakan dalam pengiriman formulir jika tombol itu sendiri digunakan untuk memulai pengiriman formulir.
kiril
8
@ Joen Bull. Browser mana yang mengirimkan teks di antara tag? Input atau tombol hanya boleh mengirimkan atribut 'nilai'. Sebuah tombol benar-benar dapat memiliki apa pun di antaranya tag, termasuk gambar atau tag HTML lainnya. Itulah inti menggunakan tombol di atas elemen input, dan Anda mencoba menyarankan browser akan membuang semua konten itu sebagai nilainya? Tidak mungkin.
Triynko
93

Ada pendekatan HTML5 baru untuk ini, formactionatributnya:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

Tampaknya ini tidak bekerja di IE9 dan sebelumnya, tetapi untuk browser lain Anda harus baik-baik saja (lihat: w3schools.com HTML <button> Atribut formasi HTML ).

Secara pribadi, saya biasanya menggunakan Javascript untuk mengirimkan formulir dari jarak jauh (untuk umpan balik yang dirasakan lebih cepat) dengan pendekatan ini sebagai cadangan. Di antara keduanya, satu-satunya orang yang tidak tercakup adalah IE <9 dengan Javascript dinonaktifkan.

Tentu saja, ini mungkin tidak tepat jika Anda pada dasarnya mengambil tindakan sisi-server yang sama terlepas dari tombol mana yang ditekan, tetapi sering jika ada dua tindakan sisi pengguna yang tersedia maka mereka akan memetakan ke dua tindakan sisi-server juga.

Sunting: Seperti dicatat oleh Pascal_dher di komentar, atribut ini juga tersedia di <input>tag.

Leo
sumber
1
Juga tersedia untuk tag "input". Mengakses ke w3schools: saat menggunakan tag tombol, browser yang berbeda dapat mengirimkan nilai yang berbeda: w3schools.com/tags/tag_button.asp
Pascal_dher
3
Saya telah menjadi pengembang web selama 12 tahun dan yang ini baru bagi saya dan sebenarnya adalah apa yang saya butuhkan. Terima kasih!
KyleFarris
1
Terima kasih @KyleFarris! Saya percaya ini hanya menjadi mungkin relatif baru-baru ini, jadi tidak mengherankan jika Anda belum menemukannya.
Leo
2
Catatan untuk pengguna Rails: menambahkan atribut ini tidak akan berfungsi jika formulir Anda dibuat menggunakan form_tag. Satu-satunya cara saya membuatnya bekerja adalah beralih ke form_fordan menggunakan f.submit formaction: 'your_path'.
fgblomqvist
2
formactionpada MDN
akinuri
27

Ini sangat mudah untuk diuji

<form action="" method="get">

<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">

</form>

Masukkan saja itu di halaman HTML, klik tombol, dan lihat URL

Peter Bailey
sumber
5
Menggunakan GET di sini adalah praktik yang agak buruk, orang harus menggunakan POST bila memungkinkan.
Syncrossus
6
@ Syncrossus Itu untuk tujuan pengujian.
Etienne Martin
22

Gunakan formactionatribut HTML (baris ke-5):

<form action="/action_page.php" method="get">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br>
    <button type="submit">Submit</button><br>
    <button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>
Thirumalmani Lavanyan
sumber
2
Ini mirip dengan jawaban Leo sebelumnya .
ToolmakerSteve
@ToolmakerSteve - Tetapi pengguna telah diputuskan . ambil pilihanmu!!
user12379095
21
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
MevlütÖzdemir
sumber
Fitur HTML5. Berfungsi sempurna di browser web terbaru, terima kasih!
Stephane Lallemagne
1
CATATAN: Ini tampaknya sama dengan jawaban Leo sebelumnya , kecuali bahwa itu menunjukkan penggunaan inputtag daripada buttontag.
ToolmakerSteve
11

Cara terbaik untuk menangani beberapa tombol kirim adalah dengan menggunakan sakelar kasus di skrip server

<form action="demo_form.php" method="get">

Choose your favorite subject:

<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>

</form>

kode server / skrip server - tempat Anda mengirimkan formulir:

demo_form.php

<?php

switch($_REQUEST['subject']) {

    case 'html': //action for html here
                break;

    case 'css': //action for css here
                break;

    case 'javascript': //action for javascript here
                        break;

    case 'jquery': //action for jquery here
                    break;
}

?>

Sumber: W3Schools.com

Shailesh Sonare
sumber
ya itu adalah Anda harus memiliki gagasan tentang skrip tindakan (teknologi skrip sisi server) Anda dapat menggunakan skrip / file apa saja untuk memproses data yang dikirimkan misalnya php, asp, jsp, dll. <form action="demo_form.php" method="get">
Shailesh Sonare
Baik. Ini membingungkan karena ada juga bahasa bernama ActionScript. Anda seharusnya mengatakan: "kode server" atau "skrip server" sebagai gantinya.
Sipil
Saya tidak tahu Anda bisa melakukannya dengan tombol
William Isted
10

Mungkin solusi yang disarankan di sini bekerja pada tahun 2009, tetapi saya telah menguji semua jawaban yang dibesarkan ini dan tidak ada yang bekerja di browser apa pun.

satu-satunya solusi yang saya temukan berfungsi adalah ini: (tapi itu agak jelek untuk digunakan saya pikir)

<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>

Joakim
sumber
2
Kenapa tidak pakai saja formaction="actionurl1"? Anda tidak perlu JavaScript.
rybo111
3
@ rybo111 browser IE9 (penyihir relatif masih digunakan secara luas) tidak mendukungformaction
clueless007
1
@inaliaghle Benar, sekitar 1% pengguna - itu tergantung kepada siapa proyek ini ditujukan. Kira-kira 1% pengguna tidak menggunakan JavaScript.
rybo111
1
Untuk pembaca masa depan: tidak ada yang salah dengan menggunakan javascript, seperti dalam jawaban ini. Ini keterampilan yang berguna untuk diketahui. OTOH, jawaban yang lebih sangat tervotifikasi juga berfungsi dengan baik - abaikan kalimat utama dari jawaban ini. Jika karena alasan tertentu Anda tidak bisa mendapatkan jawaban lain untuk bekerja, maka posting kode lengkap Anda sebagai pertanyaan SO, jelaskan apa yang terjadi (atau tidak terjadi), dan tanyakan kesalahan Anda.
ToolmakerSteve
6

Tentukan namesebagai array.

<form action='' method=POST>
    (...) some input fields (...)
    <input type=submit name=submit[save] value=Save>
    <input type=submit name=submit[delete] value=Delete>
</form>

Contoh kode server (PHP):

if (isset($_POST["submit"])) {
    $sub = $_POST["submit"];

    if (isset($sub["save"])) {
        // save something;
    } elseif (isset($sub["delete"])) {
        // delete something
    }
}

elseifsangat penting, karena keduanya akan diurai jika tidak. Nikmati.

Sangat berbahaya
sumber
Sekarang ini adalah saran yang bagus - sebagian besar karena Anda dapat menambahkan lebih banyak tombol dengan lebih banyak case dengan sangat mudah, dan menggunakan a switchdengan tindakan default jika seseorang telah menambahkan tombol dan lupa menambahkannya ke switch(dan / atau salah mengeja sesuatu dll.)
Gwyneth Llewelyn
@Pato juga menambahkan jawaban serupa yang mungkin lebih idiomatis, tetapi jawaban Anda berfungsi dengan baik!
Gwyneth Llewelyn
1
@ GwynethLlewelyn Saya tidak melihat jawaban yang lain kembali atau tidak melihat ketika saya menulis jawaban saya sendiri. Ini sebenarnya sama, tetapi ini hanya menekankan bagaimana kebanyakan orang lebih suka logika ini. Perbedaan hanya dengan nama untuk alasan semantik, pemahaman yang baik untuk pemula atau siapa pun yang suka memulai dengan itu.
Thielicious
5

Karena Anda tidak menentukan metode skrip sisi server apa yang Anda gunakan, saya akan memberikan Anda contoh yang berfungsi untuk Python, menggunakan CherryPy (meskipun mungkin juga berguna untuk konteks lain):

<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>

Daripada menggunakan nilai untuk menentukan tombol mana yang ditekan, Anda dapat menggunakan nama (dengan <button>tag bukan <input>). Dengan begitu, jika tombol Anda memiliki teks yang sama, itu tidak akan menyebabkan masalah. Nama-nama semua item formulir, termasuk tombol, dikirim sebagai bagian dari URL. Dalam CherryPy, masing-masing adalah argumen untuk metode yang melakukan kode sisi server. Jadi, jika metode Anda hanya memiliki **kwargsdaftar parameternya (alih-alih mengetikkan setiap nama setiap item formulir dengan susah payah) maka Anda dapat memeriksa untuk melihat tombol mana yang ditekan seperti ini:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code
Brōtsyorfuzthrāx
sumber
3
<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>
Osmar Kozan Jr
sumber
2

Saya pikir Anda harus bisa membaca nama / nilai dalam array GET Anda. Saya pikir tombol yang tidak diklik tidak akan muncul dalam daftar itu.

John Bubriski
sumber
Anda kemungkinan besar berarti array POST.
ypnos
3
Tidak harus, jika metode formulir adalah "POST" itu tidak akan muncul di array GET. Sebagian besar formulir dikirimkan melalui POST.
Burung beo
2
Secara teknis, ini benar atau salah. Anda bisa mengirimkan formulir dengan metode = "GET", tetapi itu bisa dianggap layak.
Bill the Lizard
4
Ini hanya "dapat ditakuti" jika digunakan secara tidak tepat: w3.org/2001/tag/doc/whenToUseGet.html .
mercator
2
Ya saya tidak mencoba menyarankan GET, saya hanya mencoba untuk menggeneralisasi hal-hal.
John Bubriski
1

Anda juga dapat melakukannya seperti ini (saya pikir ini sangat nyaman jika Anda memiliki input N).

<input type="submit" name="row[456]" value="something">
<input type="submit" name="row[123]" value="something">
<input type="submit" name="row[789]" value="something">

Kasing yang umum digunakan adalah menggunakan id berbeda dari database untuk setiap tombol, sehingga Anda nanti bisa tahu di server yang barisnya diklik.

Di sisi server (PHP dalam contoh ini) Anda dapat membaca "baris" sebagai array untuk mendapatkan id. $_POST['row']akan menjadi array dengan hanya satu elemen, dalam bentuk [ id => value ](misalnya:[ '123' => 'something' ] :).

Jadi, untuk mendapatkan id yang diklik, Anda lakukan:

$index = key($_POST['row']);

http://php.net/manual/en/function.key.php

Pato
sumber
Ini mirip dengan jawaban @Thielicious yang diposting , tetapi jawaban Anda mungkin lebih idiomatis. Secara pribadi saya lebih suka menggunakan tag alfanumerik untuk indeks (bukan angka) untuk dibaca (lebih mudah untuk mengingat apa yang seharusnya dilakukan setiap tombol), tetapi YMMV. Tetapi memanfaatkan $_POST['row']array asosiatif itu cerdas!
Gwyneth Llewelyn
1
Saya setuju bahwa, jika Anda berurusan dengan tombol statis, Anda harus menggunakan kunci bernama. Tetapi dalam beberapa kasus Anda tidak bisa. Terkadang Anda menghasilkan input tersebut secara dinamis. Kasus yang paling umum adalah daftar baris, masing-masing diidentifikasi oleh id. Saya kira saya sedang memikirkan kasus itu ketika saya menulis jawabannya (4 tahun yang lalu!). Saya telah mengeditnya sehingga lebih jelas bahwa jumlahnya adalah id dan bukan indeks.
Pato
Sudah selesai dilakukan dengan baik! Aye, saya setuju, sekarang sudah lebih jelas; Saya masih percaya bahwa jawaban Anda sedikit lebih baik daripada yang oleh @Thielicious (dan mungkin bahkan sedikit lebih efisien, terutama jika ada banyak tombol).
Gwyneth Llewelyn
1

Anda memformat beberapa tombol kirim dalam satu contoh formulir

 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress"> 
 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress"> 
thirumal mani L
sumber
0

Sederhana, Anda dapat mengubah aksi formulir pada berbagai tombol kirim Klik.

Coba ini di dokumen. Siap

$(".acceptOffer").click(function () {
       $("form").attr("action", "/Managers/SubdomainTransactions");
});

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});
Slan
sumber
0

Anda juga dapat menggunakan atribut href dan mengirim get dengan nilai yang ditambahkan untuk setiap tombol. Tapi formulir itu tidak diperlukan saat itu

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
Jonathan Laliberte
sumber
Ini tidak akan berfungsi untuk pengontrol di bawah POSTrute.
Xavi Montero
karenanya, "kirim get"
Jonathan Laliberte
3
Saya minta maaf untuk tidak setuju, tetapi GETtidak selalu cocok. Jika Anda "memodifikasi keadaan model Anda" maka Anda tidak boleh menggunakan GET, karena menyegarkan peramban dapat menghasilkan pengiriman dua kali permintaan yang sama secara transparan. Gunakan GEThanya untuk "melihat" hal-hal dan POSTuntuk mengirim permintaan perubahan negara (tambah, hapus, edit, dll.). kemudian dalam POSTtindakan pengontrol Anda, ubah status (basis data, sesion ...) dan berikan respons pengalihan yang kemudian GETdiubah menjadi status baru. Melakukan GETperubahan model-negara sangat kotor dan pembuat kode yang baik harus menghindarinya. Maaf mengatakan itu. Bersihkan kode aturanz.
Xavi Montero
Benar. Tapi bermain kotor terkadang bisa bersih. Itu tergantung pada apa yang Anda lakukan dengan tepat. Secara pribadi itu tidak akan memetakan menghapus dan mengedit permintaan pada get, tetapi ada cara untuk membuatnya berfungsi .. seperti memeriksa apakah itu telah dihapus, atau memeriksa apakah pengguna memiliki izin untuk melakukannya dll ...
Jonathan Laliberte
-1

Anda dapat menyajikan tombol-tombol seperti ini:

<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">

Dan kemudian dalam kode Anda bisa mendapatkan nilainya menggunakan:

if request.method == 'POST':
    #valUnits = request.POST.get('unitsInput','')
    #valPrice = request.POST.get('priceInput','')
    valType = request.POST.get('typeBtn','')

(valUnits dan valPrice adalah beberapa nilai lain yang saya ekstrak dari formulir yang saya tinggalkan untuk ilustrasi)

pengguna3714578
sumber
-1

Karena Anda tidak menentukan metode skrip sisi server apa yang Anda gunakan, saya akan memberikan Anda contoh yang berfungsi untuk PHP

<?php
   if(isset($_POST["loginForm"]))
   {
    print_r ($_POST); // FOR Showing POST DATA
   }
   elseif(isset($_POST["registrationForm"]))
   {
    print_r ($_POST);
   }
   elseif(isset($_POST["saveForm"]))
   {
    print_r ($_POST);
   }
   else{

   }
?>
<html>
<head>
</head>
<body>
  
  <fieldset>
    <legend>FORM-1 with 2 buttons</legend>
      <form method="post" >
      <input type="text" name="loginname" value ="ABC" >

     <!--Always use type="password" for password --> 
     <input type="text" name="loginpassword" value ="abc123" >
     
     <input type="submit" name="loginForm" value="Login"><!--SUBMIT Button 1 -->
     <input type="submit" name="saveForm" value="Save">  <!--SUBMIT Button 2 -->
   </form>
  </fieldset>



  <fieldset>
    <legend>FORM-2 with 1 button</legend>
     <form method="post" >
      <input type="text" name="registrationname" value ="XYZ" >
      
     <!--Always use type="password" for password -->
     <input type="text" name="registrationpassword" value ="xyz123" >
     
     <input type="submit" name="registrationForm" value="Register"> <!--SUBMIT Button 3 -->
   </form>
  </fieldset>
  

</body>
</html>

Formulir

Ketika klik pada Login -> loginForm

Ketika klik Simpan -> saveForm

Ketika klik pada Register -> registrasiForm

Pradip Kumar Raushan
sumber