PHPでボタンクリック時の処理を実装する方法|初心者向け完全ガイド

Webサイトを作っていて、「ボタンを押したら何か処理をさせたい」と思ったことはありませんか?

例えば、「送信」ボタンを押したらメールが送られる、「削除」ボタンを押したらデータが消える、「いいね」ボタンを押したらカウントが増える……こういった機能は、どのWebサイトにも欠かせない基本的な仕組みです。

PHPでボタンクリックの処理を実装する方法は、実はそれほど難しくありません。

ただし、正しい知識がないと「ボタンを押しても何も起きない」「意図しない動作をしてしまう」といったトラブルに遭遇することもあるんですね。

この記事では、PHPでボタンがクリックされたことを検知し、適切に処理を実行する方法を、基礎から丁寧に解説していきます。

コピー&ペーストで使える実例も豊富に用意しましたので、ぜひ最後までお付き合いください!

スポンサーリンク

PHPとボタンクリックの基本的な仕組み

まず、PHPがどのようにボタンクリックを処理するのか、基本的な仕組みを理解しましょう。

PHPはサーバー側で動く言語

重要なポイントとして、PHPはサーバー側で実行される言語です。

つまり、ユーザーのブラウザ上で直接ボタンクリックを検知することはできません。JavaScriptとは異なる点なんですね。

では、どうやってボタンがクリックされたことを知るのでしょうか?

フォーム送信を利用する

答えはフォーム送信です。

HTMLのフォーム機能を使ってボタンをクリックすると、データがサーバーに送信されます。そのデータをPHPが受け取って処理する、という流れになります。

基本的な処理の流れ

  1. ユーザーがブラウザでボタンをクリック
  2. フォームのデータがサーバーに送信される
  3. サーバー側のPHPがデータを受け取る
  4. PHPが処理を実行する
  5. 結果をブラウザに返す
  6. ブラウザに結果が表示される

この一連の流れを理解することが、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の違いを理解しよう

フォームでデータを送信する方法には、POSTGETの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:ボタンを押しても何も起きない

考えられる原因

  1. method属性の指定ミス(POSTとGETの混同)
  2. name属性の指定忘れ
  3. 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を使えばページリロードなしで処理できる

最初は複雑に感じるかもしれませんが、基本パターンを覚えてしまえば応用は簡単です。

特にセキュリティ対策は絶対に省略せず、必ず実装してください。

この記事のサンプルコードを参考に、実際に手を動かして試してみることをおすすめします。

実践を重ねることで、より深い理解が得られるはずです!

コメント

タイトルとURLをコピーしました