risposta-alla-domanda-sullo-sviluppo-web-bd.com

Due pulsanti di invio in un unico modulo

Ho due submit pulsanti in un modulo. Come posso determinare quale è stato colpito sul lato server?

428
Alex

Se assegni a ciascuno un nome, quello cliccato verrà inviato come qualsiasi altro input.

<input type="submit" name="button_1" value="Click me">
352
Greg

Puoi dare ad ogni input un valore diverso e mantenere lo stesso nome:

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

Quindi nel controllo del codice per vedere quale è stato attivato:

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

L'unico problema è che leghi la tua logica al testo all'interno dell'input. Puoi anche dare a ciascuno un nome univoco e controllare semplicemente $ _POST per l'esistenza di quell'input:

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

E nel codice:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}
759
Parrots

Una soluzione ancora migliore consiste nell'utilizzare i tag pulsante per inviare il modulo:

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

In questo modo non ci sono problemi con l'internazionalizzazione e con più linguaggi di visualizzazione (nella prima soluzione, l'etichetta del pulsante è anche il valore inviato al server).

81
kiril

C'è un nuovo approccio HTML5 a questo, l'attributo formaction:

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

Apparentemente questo non funziona in IE9 e precedenti, ma per altri browser dovresti stare bene (vedi: w3schools.com HTML <button> Attributo formaction ).

Personalmente, generalmente uso Javascript per inviare moduli in remoto (per un feedback percepito più veloce) con questo approccio come backup. Tra i due, le uniche persone non coperte sono IE <9 con Javascript disabilitato.

Ovviamente, ciò potrebbe essere inappropriato se stai praticamente prendendo la stessa azione sul lato server indipendentemente dal pulsante che è stato premuto, ma spesso se ci sono due azioni sul lato utente disponibili, verranno mappate anche a due azioni sul lato server.

Modifica: Come notato da Pascal_dher nei commenti, questo attributo è disponibile anche sul tag <input>.

59
Leo

Questo è estremamente facile da testare

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

Basta inserirlo in una pagina HTML, fare clic sui pulsanti e guardare l'URL

26
Peter Bailey
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
16
MevlütÖzdemir

Forse le soluzioni suggerite qui hanno funzionato nel 2009, ma sono state testate tutte queste risposte in aumento e nessuno sta lavorando su nessun browser.

l'unica soluzione che ho trovato funziona è questa: (ma è un po 'brutto da usare, credo)

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

Il modo migliore per gestire il pulsante di invio multiplo è l'utilizzo di switch case nello script del 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>

script del codice server/server - in cui si invia il modulo:

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

?>

Fonte: W3Schools.com

8
Shailesh Sonare

usa l'attributo HTML di 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>
5

Dato che non hai specificato quale metodo di scripting lato server stai usando, ti darò un esempio che funziona per Python, usando CherryPy (sebbene possa essere utile anche per altri contesti):

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

Anziché utilizzare il valore per determinare quale pulsante è stato premuto, è possibile utilizzare il nome (con il tag <button> anziché <input>). In questo modo, se i tuoi pulsanti hanno lo stesso testo, non causerà problemi. I nomi di tutti gli elementi del modulo, inclusi i pulsanti, vengono inviati come parte dell'URL. In CherryPy, ognuno di questi è un argomento per un metodo che esegue il codice lato server. Quindi, se il tuo metodo ha solo **kwargs per il suo elenco di parametri (invece di digitare noiosamente ogni singolo nome di ogni elemento del modulo), puoi controllare per vedere quale pulsante è stato premuto in questo modo:

if "register" in kwargs:
    pass #Do the register code
Elif "login" in kwargs:
    pass #Do the login code
4
Shule

Definisci name come 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>

Esempio di codice server (PHP):

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

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

elseif molto importante, perché entrambi saranno analizzati se non lo sono. Godere.

3
Thielicious
<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
Osmar Kozan Jr

Penso che dovresti essere in grado di leggere il nome/valore nel tuo array GET. Penso che il pulsante che non è stato cliccato non apparirà in quella lista.

2
John Bubriski

Se hai due pulsanti di invio con una funzione diversa, indica esplicitamente i pulsanti di input con tipo di invio come:

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

Non devi preoccuparti di quale pulsante viene chiamato sul lato server. Scrivi la tua logica in ciascuna funzione separatamente e chiamale. Faranno il loro lavoro senza interferire con gli altri.

0

Semplice è possibile modificare l'azione del modulo su diversi pulsanti di invio Fare clic.

Prova questo nel documento. Pronto

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

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

Puoi anche farlo in questo modo (penso che sia molto conveniente se hai N ingressi).

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

E poi sul lato server (PHP nel mio esempio) puoi leggere "row" come array per ottenere l'indice:

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

$ _POST ['row'] sarà un array con un solo elemento, nel formato index => value (ad esempio: '2' => 'something').

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

0
Pato

Puoi anche utilizzare un attributo href e inviare un get con il valore aggiunto per ciascun pulsante. Ma il modulo non sarebbe richiesto allora 

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
0