PHPでチェックボックスの複数データを配列として受け取る方法【初心者向け】

HTMLフォームの中でも、チェックボックスはユーザーに複数の選択肢を同時に選ばせることができる便利な入力部品です。「興味のあるカテゴリをすべて選択」や「利用規約に同意」など、様々な場面で利用されます。

しかし、複数の値が送信される可能性があるため、PHPでの受け取り方に少しだけコツが必要です。

今回は、複数のチェックボックスから送信されたデータを、PHPで「配列」としてスマートに受け取り、表示する方法を解説します。


目次

1. HTMLフォームの重要なポイント:name属性の[]

複数のチェックボックスの値をPHPで一度に受け取るための最大の秘訣は、HTMLのname属性の書き方にあります。

属性値を name="hobbies[]" のように、末尾に角括弧[]を付けるのです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>チェックボックスのフォーム</title>
</head>
<body>
    <h1>フォームの作成</h1>
    <p>あなたの興味がある分野をすべて選択してください。</p>
    <form action="receive.php" method="POST">
        <p>
            <input type="checkbox" name="interests[]" value="プログラミング"> プログラミング
            <input type="checkbox" name="interests[]" value="デザイン"> デザイン
            <input type="checkbox" name="interests[]" value="マーケティング"> マーケティング
            <input type="checkbox" name="interests[]" value="音楽"> 音楽
            <input type="checkbox" name="interests[]" value="旅行"> 旅行
        </p>
        <input type="submit" value="送信する">
    </form>
</body>
</html>

この[]を付けることで、PHPは「interestsという名前のデータは、複数来る可能性があるから配列として扱おう」と自動的に解釈してくれます。もし[]を付けずにname="interests"としてしまうと、最後にチェックされた項目の値しか送信されません。


2. PHPで配列としてデータを受信する

name="interests[]"と名付けたフォームからデータが送信されると、受信側のPHPファイルでは$_POST['interests']という変数でデータを受け取ることができます。そして、この$_POST['interests']の中身は配列になっています。

実際にvar_dump()を使って、受信したデータの中身を確認してみましょう。

// receive.php
<?php
// "プログラミング"と"旅行"にチェックを入れて送信した場合

$selected_interests = $_POST["interests"];
var_dump($selected_interests);

var_dump()の実行結果:

array(2) {
  [0]=> string(21) "プログラミング"
  [1]=> string(6) "旅行"
}

このように、チェックを入れた項目のvalue属性の値だけが、配列として格納されているのが分かります。


3. foreachで選択された項目をすべて表示する

データが配列として受け取れたので、あとはforeachループを使えば、選択された項目を一つずつ取り出して簡単に表示することができます。

// receive.php の続き
<h3>あなたが選択した分野</h3>
<ul>
    <?php foreach ($selected_interests as $interest): ?>
        <li><?php echo htmlspecialchars($interest, ENT_QUOTES, 'UTF-8'); ?></li>
    <?php endforeach; ?>
</ul>

セキュリティのポイント htmlspecialchars()関数は、ユーザーが入力したデータに含まれる可能性のある悪意のあるHTMLタグを無害化するために必須です。ユーザーからのデータを画面に出力する際は、必ずこの処理を行う癖をつけましょう。


4. 何も選択されなかった場合を考慮する

もしユーザーが何もチェックを入れずにフォームを送信した場合、$_POST['interests']というキー自体が送信されません。その状態で$_POST['interests']を直接使おうとすると、「Undefined index(未定義のキーです)」というエラー(Notice)が発生してしまいます。

これを避けるため、foreachで処理する前にisset()を使って、データが送信されてきているかをチェックするのが安全な方法です。

完成版コード

これまでの内容をすべてまとめた、2つのファイルの完成版コードです。

送信ページ form.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>チェックボックスのフォーム</title>
</head>
<body>
    <h1>フォームの作成</h1>
    <p>あなたの興味がある分野をすべて選択してください。</p>
    <form action="receive.php" method="POST">
        <p>
            <input type="checkbox" name="interests[]" value="プログラミング"> プログラミング
            <input type="checkbox" name="interests[]" value="デザイン"> デザイン
            <input type="checkbox" name="interests[]" value="マーケティング"> マーケティング
            <input type="checkbox" name="interests[]" value="音楽"> 音楽
            <input type="checkbox" name="interests[]" value="旅行"> 旅行
        </p>
        <input type="submit" value="送信する">
    </form>
</body>
</html>

受信ページ receive.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>受信ページ</title>
</head>
<body>
    <h1>選択された内容</h1>
    
    <?php
    // `interests`が送信されてきて、かつ空でないかをチェック
    if (isset($_POST['interests']) && is_array($_POST['interests'])) {
        $selected_interests = $_POST['interests'];
    ?>
        <h3>あなたが選択した分野:</h3>
        <ul>
            <?php foreach ($selected_interests as $interest): ?>
                <li><?php echo htmlspecialchars($interest, ENT_QUOTES, 'UTF-8'); ?></li>
            <?php endforeach; ?>
        </ul>
    <?php
    } else {
        // 何も選択されなかった場合のメッセージ
        echo "<p>興味のある分野が選択されていません。</p>";
    }
    ?>
    <p><a href="form.html">フォームに戻る</a></p>
</body>
</html>

まとめ

今回は、複数のチェックボックスの値を受け取る方法について学びました。

【重要ポイントの振り返り】

  1. HTML側で、チェックボックスのname属性の末尾に**[]**を付ける。
  2. PHP側では、$_POSTのデータが配列として格納される。
  3. データが存在するかを**isset()でチェックしてから、foreachで処理**する。

このテクニックは、アンケートフォームや管理画面の設定など、様々な機能で応用できます。ぜひマスターして、よりインタラクティブなフォームを作成してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次