PHP のフォーム送信で、どのボタンがクリックされたかを知るにはどうしたらよいですか?
質問
私のページにはいくつかのボタンがありますが、どれがクリックされたかを知る方法がわかりません。 以下は私の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 ソースコードに表示される最初の送信ボタンを仮定するか、デフォルトとします。 . 実際には、様々なブラウザは確実に投稿データと共に投稿ボタンの名前/値を送信します。
- ユーザーがマウスまたはポインティング デバイスで送信ボタンを文字通りクリックした場合。
- または、送信ボタンにフォーカスがあり (ユーザーは送信ボタンにタブで移動した)、その後に を入力します。 キーが押されました。
フォームを送信する他の方法も存在し、いくつかのブラウザ/バージョンは、以下のように決定します。 送信ボタンの名前と値を送信しない。 を送信しないことにしているブラウザやバージョンもあります。例えば 多くのユーザー を押してフォームを送信します。 入力
そうでなければ、ユーザーがフォームを送信したにもかかわらず、「何も起こらない」「データが失われた」といったことになり、ユーザーを本当にいらいらさせてしまうことになります。
また、上記のアドバイスは、単一の送信ボタンを持つフォームにも使用されるべきです。 常にデフォルトの送信ボタンを想定する .
インターネットにはたくさんのフォームハンドラのチュートリアルがありますが、そのほとんどは送信ボタンの名前と値をチェックする以上のことはしていません。しかし それらは単に間違っているのです!
編集、ここにもっと例があります。
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特有の動作に依存しないため、他の言語にも容易に適用できます。
関連
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み] libapache2-mod-php7 パッケージの場所がわからない
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。
-
[解決済み] ボタンのクリックでPHPの関数を呼び出す方法
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】pdo - 非オブジェクトのメンバー関数prepare()への呼び出し【重複】。
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。
-
[解決済み] POSTが存在するか確認する