1. ホーム
  2. php

PHP のフォーム送信で、どのボタンがクリックされたかを知るにはどうしたらよいですか?

2023-09-02 04:29:49

質問

私のページにはいくつかのボタンがありますが、どれがクリックされたかを知る方法がわかりません。 以下は私の2つのボタンのためのマークアップです。

<input type="submit" id="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" value="Delete" />

どのように解決するのですか?

のようなHTMLフォームで。

<input type="submit" name="btnSubmit" value="Save Changes">
<input type="submit" name="btnDelete" value="Delete">

(このとき <form method=POST )

使用するPHPのコードは次のようになります。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Something posted

  if (isset($_POST['btnDelete'])) {
    // btnDelete 
  } else {
    // Assume btnSubmit 
  }
}

あなたは常に フォームの HTML ソースコードに表示される最初の送信ボタンを仮定するか、デフォルトとします。 . 実際には、様々なブラウザは確実に投稿データと共に投稿ボタンの名前/値を送信します。

  1. ユーザーがマウスまたはポインティング デバイスで送信ボタンを文字通りクリックした場合。
  2. または、送信ボタンにフォーカスがあり (ユーザーは送信ボタンにタブで移動した)、その後に を入力します。 キーが押されました。

フォームを送信する他の方法も存在し、いくつかのブラウザ/バージョンは、以下のように決定します。 送信ボタンの名前と値を送信しない。 を送信しないことにしているブラウザやバージョンもあります。例えば 多くのユーザー を押してフォームを送信します。 入力

そうでなければ、ユーザーがフォームを送信したにもかかわらず、「何も起こらない」「データが失われた」といったことになり、ユーザーを本当にいらいらさせてしまうことになります。

また、上記のアドバイスは、単一の送信ボタンを持つフォームにも使用されるべきです。 常にデフォルトの送信ボタンを想定する .

インターネットにはたくさんのフォームハンドラのチュートリアルがありますが、そのほとんどは送信ボタンの名前と値をチェックする以上のことはしていません。しかし それらは単に間違っているのです!

編集、ここにもっと例があります。

3つ以上のボタンがあるフォームです。

<input type="submit" name="btnSubmit1" value="1">
<input type="submit" name="btnSubmit2" value="2">
<input type="submit" name="btnSubmit3" value="3">

phpです。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Something posted

  if (isset($_POST['btnSubmit3'])) {
    // btnSubmit3 
  } else if (isset($_POST['btnSubmit2'])) {
    // btnSubmit2 
  } else {
    // Assume btnSubmit1 
  }
}

シングルボタンのフォームです。

<input type="submit" name="btnSubmit1" value="1">

phpです。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Something posted

  // Assume btnSubmit1 
}

どのような場合でも フォームの html に表示される最初の送信ボタンが、クリックされたボタンであると仮定します。 . フォームの後半に表示されるボタンだけは、明示的にテストする必要があります。

言い換えれば、別のボタンを送信元として検出できない限り、最初のボタンは常にフォームの送信元と見なされます。

についてはどうでしょうか。 <form method="GET" ?

を使用できる理由は $_SERVER['REQUEST_METHOD'] === 'POST' を使ってフォームの POST を検出できるのは、POST が意図的であるのに対して GET はそうではないからです - GET がデフォルトです。つまり、GET がデフォルトだからです。 $_SERVER['REQUEST_METHOD'] === 'GET' を使用すると、誰かがページ/url を読み込んでいるだけで、実際にはフォームを送信していない可能性があるため、信頼性が低くなります。

GET によるフォーム送信を確実に検出する方法はいろいろありますが、シンプルで信頼性の高い方法は、単に <input type=hidden name=submitted value=1> をフォームに追加し、その代わりに if ($_SERVER['REQUEST_METHOD'] === 'POST') を使うのではなく if (isset($_GET['submitted'])) でフォーム送信を検出します。どのボタンが押されたかを検出するコードは、POSTのときと同じままです。

ブラウザのサポート。

この戦略は優れたブラウザサポートを備えており、ブラウザ固有の動作や新しいhtml5機能には依存していません。2000年代初期のブラウザであっても、最新のブラウザと古いブラウザの両方で適切に動作するはずです。また、PHPコードのロジックは、トリッキーな動作やPHP特有の動作に依存しないため、他の言語にも容易に適用できます。