PHPのフォームボタンとは、HTMLフォーム内に設置する「送信する」「検索する」「保存する」「削除する」などのボタンを、PHP側で受け取って処理する仕組みのことです。
厳密にいうと、PHPに「フォームボタン」という専用の部品があるわけではありません。
フォームボタン自体はHTMLの<input>タグや<button>タグで作成し、ユーザーがボタンを押して送信した内容をPHPの$_POSTや$_GETで受け取ります。
たとえば、お問い合わせフォームの「送信する」ボタン、ログインフォームの「ログイン」ボタン、検索フォームの「検索」ボタン、管理画面の「保存」「削除」ボタンなどが、PHPで扱うフォームボタンの代表例です。
フォームボタンは見た目こそシンプルですが、実際には送信方法、押されたボタンの判定、入力値のチェック、セキュリティ対策など、正しく理解しておきたいポイントが多くあります。
PHPのフォームボタンの基本的な仕組み
PHPでフォームボタンを扱う基本的な流れは、次の通りです。
- HTMLでフォームを作成する
- フォーム内に送信ボタンを設置する
- ユーザーがボタンを押す
- 入力内容が指定したPHPファイルへ送信される
- PHP側で送信内容を受け取る
- 入力チェックや保存、メール送信などの処理を行う
たとえば、以下のようなフォームがあります。
<form action="submit.php" method="post">
<input type="text" name="username">
<button type="submit" name="send" value="1">送信する</button>
</form>
このフォームでは、ユーザーが名前を入力して「送信する」ボタンを押すと、submit.phpにデータが送信されます。
送信先のPHPでは、次のように受け取ることができます。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
echo htmlspecialchars($username, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . 'さん、送信されました。';
}
?>
ここで重要なのは、フォームから送られてきた値をそのまま画面に表示しないことです。
入力値を画面に出力する場合は、htmlspecialchars()を使ってHTMLとして解釈されないように処理します。
フォームボタンでよく使うタグ
PHPのフォームボタンでは、主に次のタグが使われます。
input type="submit"input type="button"input type="reset"button type="submit"button type="button"button type="reset"
それぞれ役割が異なるため、目的に合わせて使い分けることが大切です。
input type=”submit”とは
input type="submit"は、フォームの内容を送信するための基本的なボタンです。
<input type="submit" value="送信する">
valueに指定した文字が、ボタン上に表示されます。
<form action="process.php" method="post">
<input type="text" name="name">
<input type="submit" name="send" value="送信する">
</form>
この場合、「送信する」ボタンを押すと、フォームの内容がprocess.phpに送信されます。
PHP側では、次のように処理できます。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
input type="submit"は、お問い合わせフォーム、会員登録フォーム、ログインフォーム、検索フォームなど、さまざまな場面で使われます。
input type=”button”とは
input type="button"は、押しただけではフォーム送信されないボタンです。
<input type="button" value="クリック">
このボタンは、主にJavaScriptと組み合わせて使います。
<input type="button" value="確認する" onclick="alert('確認しました');">
PHPはサーバー側で動く言語です。
そのため、ブラウザ上でボタンを押した瞬間にアラートを表示したり、画面上の表示を切り替えたりする処理は、PHPではなくJavaScriptで行います。
一方、フォーム送信後の保存処理、メール送信、データベース登録などはPHPで行います。
つまり、役割を整理すると次のようになります。
| 処理内容 | 主に使う技術 |
|---|---|
| ボタンを押した瞬間に画面を変える | JavaScript |
| 入力内容をサーバーへ送信する | HTMLフォーム |
| 送信された内容を処理する | PHP |
| データベースに保存する | PHP・SQL |
| メールを送信する | PHP |
input type="button"は、単体ではPHPにデータを送信しない点を理解しておく必要があります。
input type=”reset”とは
input type="reset"は、フォームの入力内容を初期状態に戻すボタンです。
<input type="reset" value="リセット">
注意したいのは、resetボタンは入力内容を必ず空にするボタンではないという点です。
フォームを最初に表示したときの状態へ戻すボタンです。
たとえば、次のように初期値が入っている場合、
<input type="text" name="username" value="山田太郎">
<input type="reset" value="リセット">
リセットボタンを押すと、入力欄は空欄ではなく「山田太郎」に戻ります。
実務では、resetボタンは慎重に使う必要があります。
ユーザーがせっかく入力した内容を誤って消してしまう可能性があるため、お問い合わせフォームや申込みフォームでは、あえて設置しないケースも多くあります。
buttonタグとは
フォームボタンは、<button>タグでも作成できます。
<button type="submit">送信する</button>
buttonタグは、inputタグよりも柔軟に使えるのが特徴です。
ボタン内にテキストだけでなく、アイコンやspanなどのHTML要素を入れることができます。
<button type="submit" name="send" value="1">
<span>送信する</span>
</button>
デザイン性の高いボタンを作りたい場合や、アイコン付きボタンを作りたい場合は、buttonタグが便利です。
ただし、buttonタグをフォーム内で使う場合は、type属性を明示することが重要です。
<button type="submit">送信する</button>
<button type="button">戻る</button>
<button type="reset">リセット</button>
フォーム内のbuttonタグは、typeを省略すると基本的にsubmitとして扱われます。
つまり、ただのボタンのつもりで次のように書くと、意図せずフォームが送信される可能性があります。
<button>戻る</button>
送信させたくないボタンには、必ずtype="button"を指定しましょう。
<button type="button">戻る</button>
PHPでフォームボタンの値を受け取る方法
PHPでフォームから送られた値を受け取るには、フォームのmethod属性に応じて$_POSTまたは$_GETを使います。
<form action="process.php" method="post">
このようにmethod="post"を指定した場合は、PHP側で$_POSTを使います。
$name = $_POST['name'] ?? '';
一方、method="get"を指定した場合は、$_GETを使います。
$keyword = $_GET['keyword'] ?? '';
通常のHTMLフォームであれば、この考え方で問題ありません。
ただし、JavaScriptのfetch()などでJSON形式のデータを送信する場合は、$_POSTに値が入らないことがあります。
その場合は、php://inputなどを使ってリクエスト本文を取得する必要があります。
初心者向けには、まずは通常のHTMLフォームではPOSTなら$_POST、GETなら$_GETで受け取ると理解しておけばよいでしょう。
POSTで受け取る場合
POSTは、登録フォーム、ログインフォーム、お問い合わせフォーム、更新処理、削除処理などでよく使われます。
<form action="process.php" method="post">
<label>
名前:
<input type="text" name="name">
</label>
<button type="submit" name="send" value="1">送信する</button>
</form>
送信先のprocess.phpでは、次のように受け取ります。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
if ($name === '') {
echo '名前を入力してください。';
} else {
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . 'さん、送信ありがとうございます。';
}
}
?>
trim()は、入力値の前後にある余分な空白を取り除くために使います。
また、画面に表示する際はhtmlspecialchars()でエスケープしています。
個人情報やパスワードなどを送信する場合は、GETではなくPOSTを使うのが一般的です。
ただし、POSTにしただけで安全になるわけではありません。
実際のサイトでは、HTTPS通信、入力チェック、CSRF対策などもあわせて行う必要があります。
GETで受け取る場合
GETは、検索フォームや絞り込み、ページ移動などでよく使われます。
<form action="search.php" method="get">
<label>
キーワード:
<input type="text" name="keyword">
</label>
<button type="submit" name="search" value="1">検索する</button>
</form>
送信先のsearch.phpでは、次のように受け取ります。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$keyword = trim($_GET['keyword'] ?? '');
echo '検索キーワード:' . htmlspecialchars($keyword, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
GETで送信した内容は、URLに表示されます。
search.php?keyword=PHP&search=1
そのため、検索条件をURLとして共有したい場合や、ブックマークしたい場合に便利です。
一方で、パスワードや個人情報など、URLに表示されたり履歴に残ったりすると困る情報の送信には向いていません。
POSTとGETの違い
PHPでフォームボタンを扱う場合、POSTとGETの違いを理解しておくことが大切です。
| 項目 | POST | GET |
|---|---|---|
| 送信場所 | リクエストボディ | URL |
| URLへの表示 | 表示されない | 表示される |
| 主な用途 | 登録、ログイン、問い合わせ、更新、削除 | 検索、絞り込み、ページ移動 |
| ブックマーク | 不向き | 向いている |
| 共有URL | 作りにくい | 作りやすい |
| 個人情報の送信 | GETより向いている | 不向き |
ただし、POSTはURLに表示されないだけで、通信内容が自動的に暗号化されるわけではありません。
安全に送信するには、HTTPS通信を使うことが前提です。
使い分けの目安は次の通りです。
検索・絞り込み・ページ番号 → GET
登録・更新・削除・ログイン・問い合わせ → POST
特に、データの登録・更新・削除など、サーバー側の状態を変更する処理にはPOSTを使うのが一般的です。
フォーム送信を判定する方法
PHPでフォームが送信されたかどうかを判定する場合は、$_SERVER['REQUEST_METHOD']を使う方法がよく使われます。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// POST送信されたときの処理
}
この書き方にすると、フォームがPOST送信された場合だけ処理を実行できます。
ボタンにname属性を付けて、押されたボタンを判定することもできます。
if (isset($_POST['send'])) {
// sendボタンが押された場合の処理
}
ただし、実務では次のように考えると整理しやすいです。
フォームが送信されたかどうか → REQUEST_METHODで判定
どのボタンが押されたか → ボタンのnameとvalueで判定
そのため、複数ボタンがあるフォームでは、次のような書き方が管理しやすくなります。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
if ($action === 'save') {
// 保存処理
} elseif ($action === 'delete') {
// 削除処理
}
}
複数のフォームボタンをPHPで判定する方法
1つのフォーム内に複数のボタンを設置し、押されたボタンによって処理を変えることもできます。
たとえば、管理画面で「プレビュー」「保存」「削除」の3つのボタンを置くケースです。
<form action="process.php" method="post">
<input type="text" name="title">
<button type="submit" name="action" value="preview">プレビュー</button>
<button type="submit" name="action" value="save">保存</button>
<button type="submit" name="action" value="delete">削除</button>
</form>
このように、複数の送信ボタンに同じnameを付け、valueだけを変えると、PHP側で処理を分けやすくなります。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
$title = trim($_POST['title'] ?? '');
if ($action === 'preview') {
echo 'プレビューを表示します。';
} elseif ($action === 'save') {
echo '保存処理を行います。';
} elseif ($action === 'delete') {
echo '削除処理を行います。';
}
}
?>
このようにすれば、1つのフォームで複数の処理を分岐できます。
ボタンの表示名と送信値は分けると管理しやすい
buttonタグを使う場合、画面に表示する文字とPHPへ送る値を分けられます。
<button type="submit" name="action" value="send">この内容で送信する</button>
この場合、画面には「この内容で送信する」と表示されますが、PHPへ送信される値はsendです。
$action = $_POST['action'] ?? '';
if ($action === 'send') {
// 送信処理
}
処理の分岐には、日本語の表示文言ではなく、英数字の値を使うのがおすすめです。
たとえば、次のような値です。
confirm
send
save
delete
back
preview
search
日本語のvalueでも動作はしますが、後から文言を変更したときに処理側も修正が必要になる場合があります。
<button type="submit" name="action" value="送信する">送信する</button>
上記のように書くよりも、次のように書いた方が管理しやすいです。
<button type="submit" name="action" value="send">送信する</button>
表示文言と処理用の値を分けておくと、保守しやすいフォームになります。
ボタンのnameとvalueが送信される条件
送信ボタンにnameとvalueを付けると、通常はそのボタンを押して送信したときに、PHP側で値を受け取れます。
<button type="submit" name="action" value="save">保存</button>
PHP側では、次のように取得できます。
$action = $_POST['action'] ?? '';
ただし、ボタンのnameとvalueは、実際にそのボタンを使ってフォーム送信された場合に送られます。
たとえば、JavaScriptでフォームを直接送信する場合などは、押されたボタンの情報が送られないことがあります。
document.querySelector('form').submit();
このような方法では、ユーザーが特定の送信ボタンを押した扱いにならない場合があります。
そのため、ボタン情報に依存する処理を作る場合は、通常のクリック送信を前提にするか、JavaScript側でも必要な値を明示的にセットする必要があります。
初心者向けの通常フォームではあまり気にしすぎる必要はありませんが、JavaScriptと組み合わせる場合には注意しておきたいポイントです。
確認画面付きフォームでのボタンの使い方
お問い合わせフォームや申込みフォームでは、次のような流れを作ることがあります。
入力画面 → 確認画面 → 完了画面
このようなフォームでは、「確認する」「戻る」「送信する」などのボタンを使い分けます。
<button type="submit" name="mode" value="confirm">確認画面へ進む</button>
<button type="submit" name="mode" value="back">入力画面に戻る</button>
<button type="submit" name="mode" value="send">この内容で送信する</button>
PHP側では、modeの値によって処理を分けます。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$mode = $_POST['mode'] ?? '';
if ($mode === 'confirm') {
// 入力内容をチェックして確認画面を表示
} elseif ($mode === 'back') {
// 入力画面に戻す
} elseif ($mode === 'send') {
// メール送信やデータ保存を行う
}
}
?>
確認画面付きフォームでは、ボタンの役割を明確にしておくことが大切です。
特に「戻る」と「送信する」は、ユーザーにとって意味が大きく異なります。
誤操作を防ぐためにも、ボタンの文言はわかりやすくしましょう。
JavaScriptで確認ダイアログを表示するボタン
削除処理のように取り消しが難しい操作では、ボタンを押したときに確認ダイアログを表示することがあります。
<form action="delete.php" method="post">
<input type="hidden" name="id" value="123">
<button type="submit" name="action" value="delete" onclick="return confirm('本当に削除しますか?');">
削除する
</button>
</form>
confirm()で確認ダイアログを表示し、ユーザーがキャンセルを押すとフォーム送信が中止されます。
ただし、JavaScriptによる確認だけに頼るのは危険です。
JavaScriptを無効にして送信される可能性や、リクエスト内容を直接送信される可能性もあります。
そのため、削除や更新などの重要な処理では、PHP側でも必ず次のような確認を行います。
- ログイン済みユーザーか
- そのデータを操作する権限があるか
- 送られてきたIDは正しいか
- CSRFトークンは正しいか
フロント側の確認は、あくまでユーザーの誤操作を防ぐための補助です。
本当の安全確認はサーバー側のPHPで行う必要があります。
hiddenとフォームボタンの組み合わせ
フォームでは、画面に表示しない値を送るためにhiddenを使うことがあります。
<form action="delete.php" method="post">
<input type="hidden" name="id" value="123">
<button type="submit" name="action" value="delete">削除する</button>
</form>
PHP側では、次のように受け取れます。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = $_POST['id'] ?? '';
$action = $_POST['action'] ?? '';
if ($action === 'delete') {
echo 'ID: ' . htmlspecialchars($id, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . 'を削除します。';
}
}
?>
ただし、hiddenの値は「画面に表示されていないだけ」です。
ユーザーが開発者ツールなどを使えば変更できます。
そのため、次のような重要な情報をhiddenの値だけで信用してはいけません。
- ユーザーID
- 商品価格
- 権限情報
- 管理者フラグ
- 削除対象ID
- 注文金額
たとえば、削除対象IDをhiddenで送る場合でも、そのIDのデータを現在のユーザーが本当に削除できるのかを、PHP側で必ず確認する必要があります。
フォームボタンの基本サンプル
以下は、名前を入力して送信すると、PHPでメッセージを表示する基本的なサンプルです。
<?php
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
if ($name === '') {
$message = '名前を入力してください。';
} else {
$safe_name = htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$message = $safe_name . 'さん、送信ありがとうございます。';
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPフォームボタンのサンプル</title>
</head>
<body>
<form action="" method="post">
<label>
名前:
<input type="text" name="name">
</label>
<button type="submit" name="send" value="1">送信する</button>
</form>
<p><?php echo $message; ?></p>
</body>
</html>
このサンプルでは、フォームの表示と送信後の処理を同じPHPファイルで行っています。
action=""は、現在のページに送信する書き方です。
サンプルではよく使われますが、実務では送信先のURLやルーティングに応じて適切に指定します。
また、header()でリダイレクトする場合は、HTMLを出力する前に処理する必要があります。
すでに画面へ文字やHTMLを出力した後では、リダイレクト用のヘッダーを送信できない場合があります。
複数ボタンを使った実用サンプル
次は、「プレビュー」「保存」「削除」の3つのボタンを持つフォームの例です。
<?php
$result = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
$title = trim($_POST['title'] ?? '');
if ($action === 'preview') {
if ($title === '') {
$result = 'プレビューするにはタイトルを入力してください。';
} else {
$safe_title = htmlspecialchars($title, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$result = 'プレビュー:' . $safe_title;
}
} elseif ($action === 'save') {
if ($title === '') {
$result = '保存するにはタイトルを入力してください。';
} else {
$safe_title = htmlspecialchars($title, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$result = '「' . $safe_title . '」を保存しました。';
}
} elseif ($action === 'delete') {
$result = '削除ボタンが押されました。';
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>複数ボタンのサンプル</title>
</head>
<body>
<form action="" method="post">
<label>
タイトル:
<input type="text" name="title">
</label>
<button type="submit" name="action" value="preview">プレビュー</button>
<button type="submit" name="action" value="save">保存</button>
<button type="submit" name="action" value="delete" onclick="return confirm('本当に削除しますか?');">
削除
</button>
</form>
<p><?php echo $result; ?></p>
</body>
</html>
このように、複数のボタンに同じname="action"を付け、valueで処理を分けると、PHP側の分岐がわかりやすくなります。
フォームボタンを安全に使うポイント
PHPでフォームボタンを扱う場合は、単にボタンを設置するだけでなく、安全に処理することも重要です。
特に、登録、更新、削除、メール送信、ログインなどの処理では、セキュリティ対策を意識する必要があります。
入力値は必ずチェックする
フォームから送信される値は、ユーザーが自由に変更できます。
そのため、PHP側で必ず入力チェックを行います。
$name = trim($_POST['name'] ?? '');
if ($name === '') {
echo '名前を入力してください。';
}
チェックする項目の例は次の通りです。
| チェック項目 | 内容 |
|---|---|
| 必須チェック | 空欄ではないか |
| 文字数チェック | 長すぎないか、短すぎないか |
| 形式チェック | メールアドレスや電話番号の形式が正しいか |
| 数値チェック | 数字として扱える値か |
| 範囲チェック | 指定範囲内の値か |
| 権限チェック | その操作を行えるユーザーか |
HTML側のrequiredやmaxlengthも便利ですが、それだけに頼ってはいけません。
ブラウザ側の制限は回避できるため、PHP側でも必ずチェックします。
出力時はhtmlspecialcharsを使う
フォームから送られた値を画面に表示する場合は、htmlspecialchars()を使います。
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
これは、入力された文字列がHTMLやJavaScriptとして実行されるのを防ぐためです。
たとえば、ユーザーが次のような文字列を入力した場合、
<script>alert('test');</script>
そのまま出力すると、ブラウザ上でスクリプトとして実行される可能性があります。
htmlspecialchars()を使うことで、HTMLタグとしてではなく、通常の文字として表示しやすくなります。
CSRF対策を行う
登録、更新、削除、送信などの処理では、CSRF対策も重要です。
CSRFとは、ユーザーが意図しない操作を外部サイトなどから実行される攻撃のことです。
対策として、フォームにトークンを入れ、送信時にPHP側で確認します。
フォーム側の例です。
<?php
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
?>
<form action="process.php" method="post">
<input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['token'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); ?>">
<button type="submit" name="send" value="1">送信する</button>
</form>
送信先のPHPでは、次のように確認します。
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['token'] ?? '';
if (!hash_equals($_SESSION['token'] ?? '', $token)) {
exit('不正な送信です。');
}
echo '正常な送信です。';
}
?>
重要な処理では、CSRFトークンを使って、正しいフォームから送信されたものかを確認することが大切です。
二重送信を防ぐ
フォームボタンでは、ユーザーがボタンを連続クリックしたり、送信後にブラウザを更新したりすることで、同じ処理が複数回実行されることがあります。
これを防ぐ方法として、次のような対策があります。
- 送信後に完了ページへリダイレクトする
- JavaScriptで送信ボタンを一時的に無効化する
- CSRFトークンを使い回せないようにする
- データベース側で重複登録を防ぐ
- 注文番号や受付番号を一意に管理する
よく使われる方法が、送信後に別ページへリダイレクトする方法です。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 保存処理や送信処理を行う
header('Location: thanks.php');
exit;
}
?>
このように、POST処理の後に完了ページへ移動させることで、ブラウザ更新による再送信を防ぎやすくなります。
ただし、header()は画面にHTMLや文字を出力する前に実行する必要があります。
また、header()の後にはexit;を書いて、その後の処理が続かないようにしましょう。
フォームボタンの文言をわかりやすくする
フォームボタンでは、機能だけでなく文言も重要です。
ユーザーがボタンを見たときに、「押すと何が起きるのか」がわかるようにしましょう。
わかりやすいボタン文言の例です。
確認画面へ進む
この内容で送信する
会員登録する
検索する
保存する
この投稿を削除する
お問い合わせ内容を送信する
反対に、次のような文言は意味が曖昧になる場合があります。
OK
実行
次へ
送る
クリック
特に、削除や購入、申込みなどの重要な操作では、ボタンの文言を具体的にすることが大切です。
たとえば、単に「削除」とするよりも、
この投稿を削除する
とした方が、ユーザーは何が削除されるのかを理解しやすくなります。
フォームボタンのデザイン例
フォームボタンはCSSで見た目を調整できます。
<button type="submit" class="btn">送信する</button>
.btn {
padding: 10px 24px;
border: none;
border-radius: 4px;
background: #333;
color: #fff;
font-size: 16px;
cursor: pointer;
}
.btn:hover {
opacity: 0.8;
}
フォームボタンは、ユーザーに次の行動を促す重要なパーツです。
そのため、クリックしやすいサイズ、読みやすい文字、わかりやすい配置を意識しましょう。
特にスマートフォンでは、ボタンが小さすぎると押しづらくなります。
タップしやすい余白を確保し、主要なボタンが目立つようにデザインすることが大切です。
よくあるエラーと対処法
ボタンを押してもPHPが動かない
ボタンを押してもPHPが動かない場合は、次の点を確認します。
formタグが正しく書かれているかactionの送信先が正しいかmethodがPHP側の受け取り方と一致しているか- ボタンの
typeがsubmitになっているか - PHPファイルをWebサーバー上で実行しているか
たとえば、PHPファイルをブラウザで直接開いているだけでは、PHPが正しく実行されない場合があります。
PHPを動かすには、ローカル環境やレンタルサーバーなど、PHPが実行できる環境が必要です。
$_POSTで値が取れない
$_POSTで値が取れない場合は、フォーム側のmethodを確認しましょう。
<form method="get">
このようにGETになっている場合、PHP側では$_POSTではなく$_GETで受け取ります。
$keyword = $_GET['keyword'] ?? '';
また、入力欄にname属性がない場合も、PHP側で値を受け取れません。
<input type="text">
これでは値が送信されません。
次のようにnameを付ける必要があります。
<input type="text" name="username">
フォームの値をPHPで受け取るには、name属性が非常に重要です。
buttonタグで意図せず送信される
フォーム内でbuttonタグを使う場合、typeを省略すると送信ボタンとして扱われます。
<button>戻る</button>
このように書くと、戻るボタンのつもりでもフォームが送信される場合があります。
送信させたくないボタンには、必ずtype="button"を指定しましょう。
<button type="button">戻る</button>
送信するボタンには、明示的にtype="submit"を書きます。
<button type="submit">送信する</button>
このようにtypeを明示することで、意図しないフォーム送信を防ぎやすくなります。
まとめ
PHPのフォームボタンは、HTMLのinputタグやbuttonタグで作成し、PHP側で送信内容を受け取って処理します。
代表的なフォームボタンには、次のようなものがあります。
| ボタン | 役割 |
|---|---|
input type="submit" | フォームを送信する |
input type="button" | 単体では送信しない。JavaScript向き |
input type="reset" | フォームを初期状態に戻す |
button type="submit" | 柔軟に使える送信ボタン |
button type="button" | 送信しない通常ボタン |
button type="reset" | フォームを初期状態に戻す |
PHPでフォームボタンを扱う際は、次の点を押さえておきましょう。
method="post"なら$_POSTで受け取るmethod="get"なら$_GETで受け取る- フォーム送信の判定には
$_SERVER['REQUEST_METHOD']を使う - 複数ボタンは同じ
nameと異なるvalueで分岐すると管理しやすい buttonタグではtypeを明示する- 入力値は必ずPHP側でチェックする
- 画面に出力する値は
htmlspecialchars()でエスケープする hiddenの値は改ざんできるため信用しすぎない- 登録・更新・削除などではCSRF対策を行う
- 二重送信を防ぐためにリダイレクトなどを検討する
フォームボタンは、ユーザーが操作を完了するための重要な要素です。
PHPで正しく扱うには、単にボタンを設置するだけでなく、「どのボタンが押されたのか」「どの値を受け取るのか」「安全に処理できているか」まで考える必要があります。
特に実務では、フォームボタンの処理がデータ登録、メール送信、削除、決済などにつながることもあります。
そのため、PHP側での入力チェック、権限確認、CSRF対策、二重送信対策を行い、安全でわかりやすいフォームを作ることが大切です。
以上、PHPのフォームボタンについてでした。
最後までお読みいただき、ありがとうございました。










