626

フォームに2 つの送信ボタンがあります。サーバーサイドでヒットしたものを特定するにはどうすればよいですか?

4

22 に答える 22

955

解決策 1:
各入力に異なる値を与え、同じ名前を保持します。

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

問題は、ロジックを入力内のユーザーに表示されるテキストに結び付けることです。


解決策 2:
それぞれに一意の名前を付け、その入力の存在について $_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
}
于 2009-02-13T21:53:33.807 に答える
517

それぞれに名前を付けると、クリックされたものは他の入力として送信されます。

<input type="submit" name="button_1" value="Click me">
于 2009-02-13T21:48:20.493 に答える
131

これに対する新しい HTML5 のアプローチであるformaction属性があります。

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

どうやら、これはInternet Explorer 9以前では機能しませんが、他のブラウザーでは問題ないはずです (参照: w3schools.com HTML <button> formaction Attribute )。

個人的には、通常、JavaScript を使用してフォームをリモートで送信し (フィードバックをより迅速に認識できるようにするため)、このアプローチをバックアップとして使用しています。この 2 つのうち、カバーされていないのは、JavaScript が無効になっているバージョン 9 より前の Internet Explorer だけです。

もちろん、どのボタンが押されたかに関係なくサーバー側で基本的に同じアクションを実行する場合、これは不適切かもしれませんが、多くの場合、2 つのユーザー側アクションが利用可能である場合、それらは 2 つのサーバー側アクションにもマップされます。

コメントで Pascal_dher が指摘したように、この属性は<input>タグでも使用できます。

于 2015-08-10T12:07:56.160 に答える
35

これは非常に簡単にテストできます。

<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 を確認するだけです。

于 2009-02-13T21:51:28.413 に答える
29

formactionHTML 属性を使用します (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>
于 2018-07-30T06:35:50.553 に答える
23
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
于 2016-11-08T10:03:46.553 に答える
12

複数の送信ボタンを処理する最善の方法は、サーバー スクリプトでスイッチ ケースを使用することです。

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

サーバー コード/サーバー スクリプト - フォームを送信する場所:

ファイル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

于 2016-08-05T05:34:28.413 に答える
6

使用しているサーバー側のスクリプト方法を指定していないため、 CherryPyを使用して Python で機能する例を示します(ただし、他のコンテキストでも役立つ場合があります)。

<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パラメーター リストのみを持っている場合 (各フォーム アイテムの名前を 1 つ 1 つ入力するのに手間がかかるのではなく)、次のようにどのボタンが押されたかを確認できます。

if "register" in kwargs:
    pass # Do the register code
elif "login" in kwargs:
    pass # Do the login code
于 2015-12-04T14:36:59.027 に答える
2

GET配列で名前/値を読み取ることができるはずだと思います。クリックされなかったボタンはそのリストに表示されないと思います。

于 2009-02-13T21:48:26.970 に答える
0

href 属性を使用して、各ボタンに値を追加して get を送信することもできます。しかし、フォームは必要ありません

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
于 2017-07-19T21:15:00.413 に答える