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>
まとめ
今回は、複数のチェックボックスの値を受け取る方法について学びました。
【重要ポイントの振り返り】
- HTML側で、チェックボックスの
name
属性の末尾に**[]
**を付ける。 - PHP側では、
$_POST
のデータが配列として格納される。 - データが存在するかを**
isset()
でチェックしてから、foreach
で処理**する。
このテクニックは、アンケートフォームや管理画面の設定など、様々な機能で応用できます。ぜひマスターして、よりインタラクティブなフォームを作成してみてください。