Webサイトを作っていて、「ボタンを押したら何か処理をさせたい」と思ったことはありませんか?
例えば、「送信」ボタンを押したらメールが送られる、「削除」ボタンを押したらデータが消える、「いいね」ボタンを押したらカウントが増える……こういった機能は、どのWebサイトにも欠かせない基本的な仕組みです。
PHPでボタンクリックの処理を実装する方法は、実はそれほど難しくありません。
ただし、正しい知識がないと「ボタンを押しても何も起きない」「意図しない動作をしてしまう」といったトラブルに遭遇することもあるんですね。
この記事では、PHPでボタンがクリックされたことを検知し、適切に処理を実行する方法を、基礎から丁寧に解説していきます。
コピー&ペーストで使える実例も豊富に用意しましたので、ぜひ最後までお付き合いください!
PHPとボタンクリックの基本的な仕組み

まず、PHPがどのようにボタンクリックを処理するのか、基本的な仕組みを理解しましょう。
PHPはサーバー側で動く言語
重要なポイントとして、PHPはサーバー側で実行される言語です。
つまり、ユーザーのブラウザ上で直接ボタンクリックを検知することはできません。JavaScriptとは異なる点なんですね。
では、どうやってボタンがクリックされたことを知るのでしょうか?
フォーム送信を利用する
答えはフォーム送信です。
HTMLのフォーム機能を使ってボタンをクリックすると、データがサーバーに送信されます。そのデータをPHPが受け取って処理する、という流れになります。
基本的な処理の流れ
- ユーザーがブラウザでボタンをクリック
- フォームのデータがサーバーに送信される
- サーバー側のPHPがデータを受け取る
- PHPが処理を実行する
- 結果をブラウザに返す
- ブラウザに結果が表示される
この一連の流れを理解することが、PHPでのボタン処理を実装する第一歩です。
基本的な実装方法
最もシンプルなボタンクリック処理の実装例を見てみましょう。
HTMLフォームとPHPの組み合わせ
説明
ボタンがクリックされたことを検知する最も基本的な方法は、フォームの送信を利用することです。
実例:シンプルなボタン処理
<?php
// ボタンがクリックされたかチェック
if (isset($_POST['submit'])) {
echo "ボタンがクリックされました!";
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ボタンクリック処理</title>
</head>
<body>
<form method="POST" action="">
<button type="submit" name="submit">クリックしてください</button>
</form>
</body>
</html>
コードの解説
method="POST":データの送信方法を指定します(後述)action="":空欄にすると同じページに送信されますname="submit":ボタンに名前をつけますisset($_POST['submit']):このボタンがクリックされたか確認します
このコードを実行すると、ボタンをクリックすると「ボタンがクリックされました!」と表示されます。
POSTとGETの違いを理解しよう
フォームでデータを送信する方法には、POSTとGETの2種類があります。
GET方式
データをURLの末尾に付けて送信する方法です。
特徴
- URLにデータが表示される(例:
example.com?name=submit&value=1) - ブックマークできる
- データ量に制限がある(通常2KB程度)
- 機密情報の送信には不向き
使用例
検索機能、ページネーション(ページ送り)、フィルター機能など
実例
<?php
if (isset($_GET['action'])) {
echo "GETで送信されました:" . htmlspecialchars($_GET['action']);
}
?>
<form method="GET" action="">
<button type="submit" name="action" value="search">検索</button>
</form>
POST方式
データをHTTPリクエストのボディ部分に含めて送信する方法です。
特徴
- URLにデータが表示されない
- 大量のデータを送信できる
- セキュリティ面でGETより安全
- ブックマークできない
使用例
ログイン処理、データ登録、パスワード変更など
実例
<?php
if (isset($_POST['action'])) {
echo "POSTで送信されました:" . htmlspecialchars($_POST['action']);
}
?>
<form method="POST" action="">
<button type="submit" name="action" value="login">ログイン</button>
</form>
どちらを使うべき?
POSTを使うべきケース
- データの登録、更新、削除を行う場合
- パスワードなど機密情報を扱う場合
- 大量のデータを送信する場合
GETを使うべきケース
- データの取得や表示のみの場合
- URLを共有したい場合
- 検索結果など、同じURLで再表示したい場合
基本的には、データに変更を加える操作はPOST、データを取得するだけの操作はGETと覚えておくと良いでしょう。
複数のボタンを区別する方法
1つのフォームに複数のボタンがある場合、どのボタンが押されたかを判別する必要があります。
方法1:ボタンのname属性を変える
説明
各ボタンに異なる名前をつける方法です。最もシンプルで分かりやすいでしょう。
実例
<?php
if (isset($_POST['save'])) {
echo "保存ボタンがクリックされました";
} elseif (isset($_POST['delete'])) {
echo "削除ボタンがクリックされました";
} elseif (isset($_POST['cancel'])) {
echo "キャンセルボタンがクリックされました";
}
?>
<form method="POST" action="">
<button type="submit" name="save">保存</button>
<button type="submit" name="delete">削除</button>
<button type="submit" name="cancel">キャンセル</button>
</form>
方法2:ボタンのvalue属性を使う
説明
同じnameでボタンを作り、value属性で区別する方法です。
実例
<?php
if (isset($_POST['action'])) {
$action = $_POST['action'];
switch ($action) {
case 'save':
echo "保存処理を実行します";
break;
case 'delete':
echo "削除処理を実行します";
break;
case 'cancel':
echo "キャンセルしました";
break;
default:
echo "不明な操作です";
}
}
?>
<form method="POST" action="">
<button type="submit" name="action" value="save">保存</button>
<button type="submit" name="action" value="delete">削除</button>
<button type="submit" name="action" value="cancel">キャンセル</button>
</form>
switch文を使うことで、コードが読みやすくなります。
実践的な使用例
実際の開発現場でよく使われるパターンを紹介します。
例1:お問い合わせフォームの送信処理
説明
フォームからの入力内容を受け取り、バリデーション(検証)を行ってから処理を実行します。
実例
<?php
$message = "";
$errors = [];
if (isset($_POST['submit'])) {
// 入力内容を取得
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$content = trim($_POST['content'] ?? '');
// バリデーション
if (empty($name)) {
$errors[] = "お名前を入力してください";
}
if (empty($email)) {
$errors[] = "メールアドレスを入力してください";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "メールアドレスの形式が正しくありません";
}
if (empty($content)) {
$errors[] = "お問い合わせ内容を入力してください";
}
// エラーがなければ送信処理
if (empty($errors)) {
// ここにメール送信処理などを記述
$message = "お問い合わせを受け付けました";
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お問い合わせフォーム</title>
</head>
<body>
<?php if (!empty($message)): ?>
<p style="color: green;"><?php echo htmlspecialchars($message); ?></p>
<?php endif; ?>
<?php if (!empty($errors)): ?>
<ul style="color: red;">
<?php foreach ($errors as $error): ?>
<li><?php echo htmlspecialchars($error); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form method="POST" action="">
<div>
<label>お名前:</label>
<input type="text" name="name" value="<?php echo htmlspecialchars($_POST['name'] ?? ''); ?>">
</div>
<div>
<label>メールアドレス:</label>
<input type="email" name="email" value="<?php echo htmlspecialchars($_POST['email'] ?? ''); ?>">
</div>
<div>
<label>お問い合わせ内容:</label>
<textarea name="content"><?php echo htmlspecialchars($_POST['content'] ?? ''); ?></textarea>
</div>
<button type="submit" name="submit">送信</button>
</form>
</body>
</html>
例2:データベースへのデータ登録
説明
ボタンクリックでデータベースに情報を保存する処理です。
実例
<?php
// データベース接続(PDOを使用)
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$username = 'root';
$password = '';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (isset($_POST['register'])) {
$name = $_POST['name'] ?? '';
$age = $_POST['age'] ?? 0;
// プリペアドステートメントで安全に挿入
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute([$name, $age]);
echo "データを登録しました";
}
} catch (PDOException $e) {
echo "エラー:" . $e->getMessage();
}
?>
<form method="POST" action="">
<input type="text" name="name" placeholder="名前" required>
<input type="number" name="age" placeholder="年齢" required>
<button type="submit" name="register">登録</button>
</form>
例3:確認ダイアログ付きの削除処理
説明
JavaScriptと組み合わせて、削除前に確認を求める処理です。
実例
<?php
if (isset($_POST['delete']) && isset($_POST['confirm'])) {
$id = intval($_POST['id']);
// ここに削除処理を記述
echo "ID: {$id} のデータを削除しました";
}
?>
<form method="POST" action="" onsubmit="return confirm('本当に削除しますか?');">
<input type="hidden" name="id" value="123">
<input type="hidden" name="confirm" value="1">
<button type="submit" name="delete" style="background-color: red; color: white;">削除</button>
</form>
セキュリティ対策

ボタンクリック処理を実装する際は、セキュリティ対策が必須です。
1. XSS(クロスサイトスクリプティング)対策
出力する際は必ずhtmlspecialchars()を使いましょう。
悪い例
echo $_POST['name']; // 危険!
良い例
echo htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
2. CSRF(クロスサイトリクエストフォージェリ)対策
トークンを使って、正規のフォームからの送信かを確認します。
実例
<?php
session_start();
// トークン生成
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
// フォーム送信時のチェック
if (isset($_POST['submit'])) {
if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
die('不正なリクエストです');
}
// 正常な処理
echo "処理を実行しました";
// トークンを再生成
$_SESSION['token'] = bin2hex(random_bytes(32));
}
?>
<form method="POST" action="">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" name="submit">送信</button>
</form>
3. SQLインジェクション対策
データベース操作では必ずプリペアドステートメントを使用します。
悪い例
$sql = "DELETE FROM users WHERE id = " . $_POST['id']; // 危険!
良い例
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([$_POST['id']]);
4. データ型の検証
期待するデータ型かどうかを必ず確認しましょう。
実例
// 数値が期待される場合
$id = intval($_POST['id']);
// メールアドレスの場合
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
die('メールアドレスが不正です');
}
よくあるエラーと解決方法
実装時によく遭遇するエラーとその対処法を紹介します。
エラー1:「Undefined index」警告が出る
原因
配列のキーが存在しない場合に発生します。
解決方法isset()や??演算子で存在確認をしてから使用します。
// 悪い例
$name = $_POST['name'];
// 良い例
$name = $_POST['name'] ?? '';
// または
$name = isset($_POST['name']) ? $_POST['name'] : '';
エラー2:ボタンを押しても何も起きない
考えられる原因
method属性の指定ミス(POSTとGETの混同)name属性の指定忘れ- PHPコードの配置場所が間違っている
確認すべきポイント
// PHPの処理は通常、HTMLより前に記述
<?php
if (isset($_POST['submit'])) {
// ここに処理
}
?>
<form method="POST" action="">
<!-- nameを必ず指定 -->
<button type="submit" name="submit">送信</button>
</form>
エラー3:ページが再読み込みされてしまう
原因
これは正常な動作です。フォーム送信は通常、ページをリロードします。
解決方法
リダイレクトを使用するか、Ajaxで非同期通信を行います。
<?php
if (isset($_POST['submit'])) {
// 処理を実行
// 処理後にリダイレクト(PRGパターン)
header('Location: success.php');
exit;
}
?>
Ajax(非同期通信)との組み合わせ
ページをリロードせずにボタン処理を実行したい場合は、Ajaxを使います。
説明
JavaScriptからPHPにデータを送信し、結果を受け取る方法です。
実例:PHP側(process.php)
<?php
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
if ($action === 'like') {
// いいね処理
$result = ['success' => true, 'count' => 42];
} else {
$result = ['success' => false, 'message' => '不明な操作'];
}
echo json_encode($result);
}
?>
実例:JavaScript側
<button id="likeBtn">いいね</button>
<span id="likeCount">0</span>
<script>
document.getElementById('likeBtn').addEventListener('click', function() {
// Fetchでデータ送信
fetch('process.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'action=like'
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById('likeCount').textContent = data.count;
}
});
});
</script>
まとめ
PHPでボタンクリック時の処理を実装する方法について解説しました。
基本的な仕組みを理解すれば、様々な機能を実装できるようになります。
この記事のポイント
- PHPはサーバー側の言語なので、フォーム送信を通じてボタンクリックを検知する
- POSTは機密情報や更新処理、GETは検索や表示処理に使う
isset()で送信されたデータの存在を確認してから処理を行う- 複数のボタンはname属性やvalue属性で区別できる
- セキュリティ対策(XSS、CSRF、SQLインジェクション)は必須
htmlspecialchars()で出力をエスケープする- プリペアドステートメントでデータベース操作を安全に行う
- Ajaxを使えばページリロードなしで処理できる
最初は複雑に感じるかもしれませんが、基本パターンを覚えてしまえば応用は簡単です。
特にセキュリティ対策は絶対に省略せず、必ず実装してください。
この記事のサンプルコードを参考に、実際に手を動かして試してみることをおすすめします。
実践を重ねることで、より深い理解が得られるはずです!


コメント