Dwa przyciski submit w jednym formularzu

Mam dwa submit przyciski w formularzu. Jak określić, który z nich został trafiony na serwerze?

Author: ypnos, 2009-02-14

18 answers

Jeśli podasz każdemu nazwę, kliknięty zostanie wysłany jako każde inne wejście.

<input type="submit" name="button_1" value="Click me">
 336
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 21:48:20

Możesz nadać każdemu wejściu inną wartość i zachować tę samą nazwę:

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

Następnie w kodzie sprawdź, który został uruchomiony:

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

Jedynym problemem jest powiązanie logiki z tekstem wewnątrz wejścia. Możesz również nadać każdemu unikalną nazwę i po prostu sprawdzić istnienie tego wejścia w $_POST:

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

I w kodzie:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}
 732
Author: Parrots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 06:15:14

Jeszcze lepszym rozwiązaniem jest użycie znaczników przycisków do przesłania formularza:

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

W ten sposób nie ma żadnych niedogodności z internacjonalizacją i wieloma językami wyświetlania (w poprzednim rozwiązaniu Etykieta przycisku jest również wartością wysyłaną do serwera).

 72
Author: kiril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 19:16:20

Jest nowe podejście do HTML5, atrybut formaction:

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

Najwyraźniej to nie działa w IE9 i wcześniejszych, ale dla innych przeglądarek powinno być dobrze (zobacz: w3schools.com HTML atrybut formaction ).

Osobiście zazwyczaj używam Javascript do zdalnego przesyłania formularzy (dla szybszego postrzegania opinii) z tym podejściem jako kopii zapasowej. Między nimi jedynymi osobami, które nie są objęte są IE

Oczywiście, może to być nieodpowiednie, jeśli zasadniczo wykonujesz tę samą akcję po stronie serwera, niezależnie od tego, który przycisk został naciśnięty, ale często, jeśli dostępne są dwie akcje po Stronie Użytkownika, będą one mapowane do dwóch akcji po stronie serwera.

Edit: Jak zauważył Pascal_dher w komentarzach, atrybut ten jest również dostępny w znaczniku <input>.

 51
Author: Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 08:46:45

Jest to niezwykle łatwe do przetestowania]}

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

Po prostu umieść to na stronie HTML, kliknij przyciski i spójrz na adres URL

 26
Author: Peter Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 21:51:28
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
 14
Author: MevlütÖzdemir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 10:03:46

Być może proponowane tutaj rozwiązania zadziałały w 2009 roku, ale przetestowałem wszystkie te upvoted odpowiedzi i nikt nie działa w żadnej przeglądarce.

Jedynym rozwiązaniem, które znalazłem działa jest to: (ale jest trochę brzydki w użyciu myślę)

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

 11
Author: Joakim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 11:36:55

Najlepszym sposobem radzenia sobie z wieloma przyciskami submit jest użycie switch case w skrypcie serwera

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

Kod serwera / skrypt serwera-gdzie przesyłasz formularz:

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

?>

Źródło: W3Schools.com

 7
Author: Shailesh Sonare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 16:12:42

Ponieważ nie podałeś, jakiej metody skryptowej używasz po stronie serwera, podam ci przykład, który działa w Pythonie, używając CherryPy (chociaż może być przydatny również w innych kontekstach):

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

Zamiast używać wartości do określenia, który przycisk został naciśnięty, możesz użyć nazwy (ze znacznikiem <button> zamiast <input>). W ten sposób, jeśli Twoje przyciski mają ten sam tekst, nie spowoduje to problemów. Nazwy wszystkich elementów formularza, w tym przycisków, są wysyłane jako część adresu URL. W CherryPy każdy z nich jest argumentem dla metody wykonującej kod po stronie serwera. Jeśli więc twoja metoda ma tylko **kwargs dla swojej listy parametrów (zamiast żmudnie wpisywać każdą nazwę każdego elementu formularza), możesz sprawdzić, który przycisk został naciśnięty w ten sposób:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code
 4
Author: Shule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 14:45:18
<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>
 3
Author: Osmar Kozan Jr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 13:22:08

Myślę, że powinieneś być w stanie odczytać nazwę / wartość w tablicy GET. Myślę, że Przycisk, który nie został kliknięty, nie pojawi się na tej liście.

 2
Author: John Bubriski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 21:48:26

Zdefiniuj name jako 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>

Przykładowy kod serwera (PHP):

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

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

elseif bardzo ważne, ponieważ oba będą analizowane, jeśli nie. Smacznego.

 2
Author: Thielicious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-02 22:48:54

Użyj atrybutu formaction HTML

<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>
 1
Author: Thirumalmani Lavanyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-30 07:17:34

Proste możesz zmienić działanie formularza na różnych przycisków wyślij kliknij.

Spróbuj tego w dokumencie.Ready

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

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});
 0
Author: Slan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 09:34:13

Możesz też to zrobić w ten sposób (myślę, że jest to bardzo wygodne, jeśli masz N wejść).

<input type="submit" name="row[1]" value="something">
<input type="submit" name="row[2]" value="something">
<input type="submit" name="row[3]" value="something">

A następnie po stronie serwera (w moim przykładzie PHP) możesz odczytać" row " jako tablicę, aby uzyskać indeks:

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

$_POST ['row'] będzie tablicą zawierającą tylko jeden element, w postaci index => value (na przykład: '2' => 'something").

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

 0
Author: Pato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 04:10:31

Możesz również użyć atrybutu href i wysłać get z wartością dodaną dla każdego przycisku. Ale formularz nie byłby wtedy wymagany

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
 0
Author: Jonathan Laliberte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 21:15:00

Jeśli masz dwa przyciski submit z inną funkcją, to jawnie powiedz w przyciskach wejściowych z typem submit, jak:

<input type="submit" click="save()" name="saveBtn" value="save">
<input type="submit" click="update()" name="updateBtn" value="update">

Nie musisz się martwić, który przycisk zostanie wywołany po stronie serwera. Napisz swoją logikę w każdej funkcji osobno i wywołaj je. Będą wykonywać swoją pracę bez ingerowania w innych.

 0
Author: Jasmin Akther Suma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 06:56:01

Możesz prezentować przyciski w następujący sposób:

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

A następnie w kodzie można uzyskać wartość za pomocą:

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

(valUnits i valPrice to inne wartości, które wyciągam z formularza, który zostawiłem dla ilustracji)

 -1
Author: user3714578,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 09:52:33