I have two submit buttons in a form. How do I determine which one was hit serverside?
23 Answers
Solution 1:
Give each input a different value and keep the same name:
<input type="submit" name="action" value="Update" /> <input type="submit" name="action" value="Delete" /> Then in the code check to see which was triggered:
if ($_POST['action'] == 'Update') { //action for update here } else if ($_POST['action'] == 'Delete') { //action for delete } else { //invalid action! } The problem with that is you tie your logic to the user-visible text within the input.
Solution 2:
Give each one a unique name and check the $_POST for the existence of that input:
<input type="submit" name="update_button" value="Update" /> <input type="submit" name="delete_button" value="Delete" /> And in the code:
if (isset($_POST['update_button'])) { //update action } else if (isset($_POST['delete_button'])) { //delete action } else { //no button pressed } 14 Comments
If you give each one a name, the clicked one will be sent through as any other input.
<input type="submit" name="button_1" value="Click me" > 6 Comments
formaction. Or see kiril's answer for how to have the HTML visible to user be independent of the value sent to browser - solving the internationalization problem.There’s a new HTML5 approach to this, the formaction attribute:
<button type="submit" formaction="/action_one">First action</button> <button type="submit" formaction="/action_two">Second action</button> Apparently this does not work in Internet Explorer 9 and earlier, but for other browsers you should be fine (see: w3schools.com HTML <button> formaction Attribute).
Personally, I generally use JavaScript to submit forms remotely (for faster perceived feedback) with this approach as backup. Between the two, the only people not covered are Internet Explorer before version 9 with JavaScript disabled.
Of course, this may be inappropriate if you’re basically taking the same action server-side regardless of which button was pushed, but often if there are two user-side actions available then they will map to two server-side actions as well.
As noted by Pascal_dher in the comments, this attribute is also available on the <input> tag as well.
5 Comments
form_tag. The only way I got it to work is to switch to form_for and use f.submit formaction: 'your_path'.An even better solution consists of using button tags to submit the form:
<form> ... <button type="submit" name="action" value="update">Update</button> <button type="submit" name="action" value="delete">Delete</button> </form> The HTML inside the button (e.g. ..>Update<.. is what is seen by the user; because there is HTML provided, the value is not user-visible; it is only sent to server. This way there is no inconvenience with internationalization and multiple display languages (in the former solution, the label of the button is also the value sent to the server).
11 Comments
<button>: submit and reset. Note that reset does not submit anything, it just resets the form. So Jeroen's argument remains.This is extremely easy to test:
<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> Just put that in an HTML page, click the buttons, and look at the URL.
2 Comments
Use the formaction HTML attribute (5th line):
<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> 2 Comments
<form> <input type="submit" value="Submit to a" formaction="/submit/a"> <input type="submit" value="submit to b" formaction="/submit/b"> </form> 2 Comments
input tag rather than button tag.The best way to deal with multiple submit buttons is using a switch case in the server script
<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">JavaScript</button> <button name="subject" type="submit" value="jquery">jQuery</button> </form> Server code/server script - where you are submitting the form:
File 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; } ?> Source: W3Schools.com
5 Comments
<form action="demo_form.php" method="get">Maybe the suggested solutions here worked in 2009, but I’ve tested all of this upvoted answers and nobody is working in any browsers.
The only solution I found working was this (but it's a bit ugly to use I think):
<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';"/> </form> 4 Comments
formaction="actionurl1"? You don't need JavaScript.formactionYou formaction for multiple submit buttons in one form example:
<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"> 2 Comments
Define name as 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> Example server code (PHP):
if (isset($_POST["submit"])) { $sub = $_POST["submit"]; if (isset($sub["save"])) { // Save something; } elseif (isset($sub["delete"])) { // Delete something } } elseif very important, because both will be parsed if not.
6 Comments
switch with a default action if one has added a button and forgotten to add it to the switch (and/or misspelt something etc.)An HTML example to send a different form action on different button clicks:
<form action="/login" method="POST"> <input type="text" name="username" value="your_username" /> <input type="password" name="password" value="your_password" /> <button type="submit">Login</button> <button type="submit" formaction="/users" formmethod="POST">Add User</button> </form> The same form is being used to add a new user and login user.
1 Comment
As a note, if you have multiple submit buttons and you hit return (ENTER key), on the keyboard the default button value would be of the first button on the DOM.
Example:
<form> <input type="text" name="foo" value="bar"> <button type="submit" name="operation" value="val-1">Operation #1</button> <button type="submit" name="operation" value="val-2">Operation #2</button> </form> If you hit ENTER on this form, the following parameters will be sent:
foo=bar&operation=val-1 Comments
Since you didn't specify what server-side scripting method you're using, I'll give you an example that works for Python, using CherryPy (although it may be useful for other contexts, too):
<button type="submit" name="register">Create a new account</button> <button type="submit" name="login">Log into your account</button> Rather than using the value to determine which button was pressed, you can use the name (with the <button> tag instead of <input>). That way, if your buttons happen to have the same text, it won't cause problems. The names of all form items, including buttons, are sent as part of the URL.
In CherryPy, each of those is an argument for a method that does the server-side code. So, if your method just has **kwargs for its parameter list (instead of tediously typing out every single name of each form item) then you can check to see which button was pressed like this:
if "register" in kwargs: pass # Do the register code elif "login" in kwargs: pass # Do the login code Comments
<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> 1 Comment
The updated answer is to use the button with formaction and formtarget
In this example, the first button launches a different url /preview in a new tab. The other three use the action specified in the form tag.
<button type='submit' class='large' id='btnpreview' name='btnsubmit' value='Preview' formaction='/preview' formtarget='blank' >Preview</button> <button type='submit' class='large' id='btnsave' name='btnsubmit' value='Save' >Save</button> <button type='submit' class='large' id='btnreset' name='btnsubmit' value='Reset' >Reset</button> <button type='submit' class='large' id='btncancel' name='btnsubmit' value='Cancel' >Cancel</button> Comments
I think you should be able to read the name/value in your GET array. I think that the button that wasn't clicked won't appear in that list.
7 Comments
You can also do it like this (I think it's very convenient if you have N inputs).
<input type="submit" name="row[456]" value="something"> <input type="submit" name="row[123]" value="something"> <input type="submit" name="row[789]" value="something"> A common use case would be using different ids from a database for each button, so you could later know in the server which row was clicked.
In the server side (PHP in this example) you can read "row" as an array to get the id.
$_POST['row'] will be an array with just one element, in the form [ id => value ] (for example: [ '123' => 'something' ]).
So, in order to get the clicked id, you do:
$index = key($_POST['row']); 3 Comments
$_POST['row'] being an associative array is clever!You can also use a href attribute and send a get with the value appended for each button. But the form wouldn't be required then
href="/SubmitForm?action=delete" href="/SubmitForm?action=save" 4 Comments
POST routes.GET is not always suitable. If you "modify the state of your model" then you should never use a GET, as refreshing the browser could yield in transparently sending two times the same request. Use GET only to "view" things and POST to send requests of state changes (add, remove, edit, etc.). then in your POST controller action alter the state (database, sesion...) and cast a redirect-response that then GETs the new altered state. Doing GET for model-state-alteration is very dirty and any good coder should avoid so. Sorry to say that. Clean code rulez.You can present the buttons like this:
<input type="submit" name="typeBtn" value="BUY"> <input type="submit" name="typeBtn" value="SELL"> And then in the code you can get the value using:
if request.method == 'POST': #valUnits = request.POST.get('unitsInput','') #valPrice = request.POST.get('priceInput','') valType = request.POST.get('typeBtn','') (valUnits and valPrice are some other values I extract from the form that I left in for illustration)
1 Comment
Since you didn't specify what server-side scripting method you're using, I'll give you an example that works for 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> When click on Login -> loginForm
1 Comment
Simple. You can change the action of form on different submit buttons click.
Try this in document.Ready:
$(".acceptOffer").click(function () { $("form").attr("action", "/Managers/SubdomainTransactions"); }); $(".declineOffer").click(function () { $("form").attr("action", "/Sales/SubdomainTransactions"); });