Две кнопки отправки в одной форме - PullRequest
461 голосов
/ 14 февраля 2009

У меня есть две кнопки в форме. Как определить, какая из них была поражена серверной стороной?

Ответы [ 18 ]

790 голосов
/ 14 февраля 2009

Вы можете присвоить каждому входу различное значение и сохранить то же имя:

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

Затем в коде проверьте, чтобы сработало:

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

Единственная проблема в том, что вы привязываете свою логику к тексту ввода. Вы также можете дать каждому уникальное имя и просто проверить $ _POST на наличие этого ввода:

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

и в коде:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}
380 голосов
/ 14 февраля 2009

Если вы дадите каждому имя, тот, по которому щелкнули, будет отправлен как любой другой ввод.

<input type="submit" name="button_1" value="Click me">
90 голосов
/ 14 февраля 2014

Еще лучшее решение состоит в использовании тегов кнопок для отправки формы:

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

Таким образом, нет ничего неудобного с интернационализацией и несколькими языками отображения (в первом решении метка кнопки также является значением, отправленным на сервер).

68 голосов
/ 10 августа 2015

В этом есть новый подход HTML5, атрибут formaction:

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

Очевидно, что это не работает в IE9 и более ранних версиях, но для других браузеров у вас все будет в порядке (см .: w3schools.com HTML

Лично я обычно использую Javascript для удаленной отправки форм (для более быстрой обратной связи), используя этот подход в качестве резервного. Между двумя единственными людьми, которые не охвачены, являются IE <9 с отключенным Javascript. </p>

Конечно, это может быть неуместно, если вы в основном выполняете одно и то же действие на стороне сервера, независимо от того, какая кнопка была нажата, но часто, если доступно два действия на стороне пользователя, они отображаются на два действия на стороне сервера. а также.

Edit: Как отметил Pascal_dher в комментариях, этот атрибут также доступен для тега <input>.

26 голосов
/ 14 февраля 2009

Это очень легко проверить

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

Просто поместите это на HTML-страницу, нажмите кнопки и посмотрите на URL

19 голосов
/ 08 ноября 2016
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
11 голосов
/ 05 августа 2014

Возможно, предложенные здесь решения сработали в 2009 году, но я проверил все эти ответы, и никто не работает ни в одном браузере.

Единственное решение, которое я нашел работающим, таково: (но я думаю, его немного уродливо использовать)

<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';"/>

8 голосов
/ 30 июля 2018

использовать атрибут HTML formaction

<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>
8 голосов
/ 05 августа 2016

Лучший способ справиться с несколькими кнопками отправки - использовать регистр переключателя в скрипте сервера

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

код сервера / серверный скрипт - где вы отправляете форму:

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

?>

Источник: W3Schools.com

5 голосов
/ 04 декабря 2015

Поскольку вы не указали, какой метод сценариев на стороне сервера вы используете, я приведу вам пример, который работает для Python, используя CherryPy (хотя это может быть полезно и для других контекстов):

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

Вместо того, чтобы использовать значение для определения, какая кнопка была нажата, вы можете использовать имя (с тегом <button> вместо <input>). Таким образом, если ваши кнопки имеют одинаковый текст, это не вызовет проблем. Имена всех элементов формы, включая кнопки, отправляются как часть URL. В CherryPy каждый из них является аргументом для метода, который выполняет код на стороне сервера. Таким образом, если ваш метод имеет просто **kwargs для своего списка параметров (вместо утомительного ввода каждого имени каждого элемента формы), вы можете проверить, какая кнопка была нажата следующим образом:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code
...