PHPでチェックボックスの値を受け取るには、HTMLフォームでinput type="checkbox"を用意し、PHP側で$_POSTまたは$_GETを使って送信された値を取得します。
フォームの送信方法がmethod="post"なら$_POST、method="get"なら$_GETを使います。
一般的な問い合わせフォームや会員登録フォームでは、method="post"を使うことが多いため、この記事では主に$_POSTを使った例で解説します。
チェックボックスを扱うときに特に重要なのは、チェックされている場合だけ値が送信されるという点です。
未チェックの場合は、空文字や0が送られるのではなく、そもそもその項目自体が送信されません。
この仕様を理解しておくと、PHPでチェックボックスの値を受け取る処理が分かりやすくなります。
チェックボックスの基本的な受け取り方
HTMLフォームを作成する
まずは、1つのチェックボックスを送信する基本的なフォームを見てみましょう。
<form action="confirm.php" method="post">
<label>
<input type="checkbox" name="agree" value="1">
利用規約に同意する
</label>
<button type="submit">送信</button>
</form>
このフォームでは、チェックボックスに次の属性を設定しています。
name="agree"
value="1"
name属性は、PHP側で値を受け取るときのキーになります。
value属性は、チェックされたときに送信される値です。
つまり、このチェックボックスにチェックを入れて送信すると、PHP側では次のような値として受け取れます。
$_POST['agree'] = '1';
PHPでチェックされているか判定する
PHP側では、isset()を使ってチェックボックスの値が送信されているかを確認します。
<?php
if (isset($_POST['agree'])) {
echo '利用規約に同意されています。';
} else {
echo '利用規約に同意されていません。';
}
?>
チェックボックスがチェックされていれば、$_POST['agree']が存在します。
チェックされていなければ、$_POST['agree']は存在しません。
そのため、チェックボックスでは次のように直接値を参照する書き方は避けた方が安全です。
$agree = $_POST['agree'];
未チェックの場合、agreeというキーが送信されないため、PHPの設定によっては次のような警告が出ることがあります。
Warning: Undefined array key "agree"
このような警告を避けるために、isset()や??を使って値の有無を確認します。
チェックボックスは未チェックだと送信されない
未チェック時は値が空になるわけではない
チェックボックスでよくある勘違いが、未チェックの場合に空文字や0が送信されると思ってしまうことです。
例えば、次のようなチェックボックスがあるとします。
<input type="checkbox" name="mail_magazine" value="yes">
チェックされている場合は、PHP側で次のように受け取れます。
$_POST['mail_magazine'] = 'yes';
しかし、チェックされていない場合は、次のような値が送られるわけではありません。
$_POST['mail_magazine'] = '';
また、次のようにnoが自動で送られるわけでもありません。
$_POST['mail_magazine'] = 'no';
未チェックの場合は、mail_magazineという項目自体が送信されません。
そのため、PHP側では次のように判定します。
<?php
if (isset($_POST['mail_magazine'])) {
echo 'メールマガジンを受け取る';
} else {
echo 'メールマガジンを受け取らない';
}
?>
null合体演算子で受け取る
PHP 7以降では、??を使って値を受け取ることもできます。
<?php
$mailMagazine = $_POST['mail_magazine'] ?? null;
if ($mailMagazine !== null) {
echo 'メールマガジンを受け取る';
} else {
echo 'メールマガジンを受け取らない';
}
?>
??は、左側の値が存在すればその値を使い、存在しなければ右側の値を使う演算子です。
上記の例では、$_POST['mail_magazine']が存在すればその値を代入し、存在しなければnullを代入しています。
ただし、チェックされているかどうかだけを判定したい場合は、次のようにisset()を使う方がシンプルです。
<?php
$isMailMagazine = isset($_POST['mail_magazine']);
if ($isMailMagazine) {
echo 'メールマガジンを受け取る';
} else {
echo 'メールマガジンを受け取らない';
}
?>
この書き方では、チェックされていればtrue、チェックされていなければfalseとして扱えます。
複数のチェックボックスの値を受け取る方法
name属性に配列形式を使う
複数のチェックボックスを選択できるようにしたい場合は、name属性に[]を付けます。
例えば、興味のあるジャンルを複数選択できるフォームを作る場合は、次のように書きます。
<form action="confirm.php" method="post">
<p>興味のあるジャンルを選択してください。</p>
<label>
<input type="checkbox" name="interests[]" value="web">
Web制作
</label>
<label>
<input type="checkbox" name="interests[]" value="seo">
SEO
</label>
<label>
<input type="checkbox" name="interests[]" value="sns">
SNSマーケティング
</label>
<label>
<input type="checkbox" name="interests[]" value="ad">
広告運用
</label>
<button type="submit">送信</button>
</form>
ポイントは、すべてのチェックボックスでnameを次のようにすることです。
name="interests[]"
[]を付けることで、PHP側では配列として受け取れます。
例えば、「Web制作」と「SEO」にチェックを入れて送信した場合、PHP側では次のような配列になります。
$_POST['interests'] = [
'web',
'seo'
];
PHPで配列として受け取る
複数のチェックボックスの値は、PHP側で配列として受け取ります。
<?php
$interests = $_POST['interests'] ?? [];
if (!empty($interests)) {
echo '選択されたジャンル:<br>';
foreach ($interests as $interest) {
echo htmlspecialchars($interest, ENT_QUOTES, 'UTF-8') . '<br>';
}
} else {
echo '何も選択されていません。';
}
?>
ただし、実務では送信データが必ず配列であるとは限りません。
フォームはユーザー側で改ざんできるため、interestsに配列以外の値が送られてくる可能性もあります。
そのため、より安全に書くなら、次のようにis_array()で確認します。
<?php
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
if (!empty($interests)) {
echo '選択されたジャンル:<br>';
foreach ($interests as $interest) {
echo htmlspecialchars($interest, ENT_QUOTES, 'UTF-8') . '<br>';
}
} else {
echo '何も選択されていません。';
}
?>
初心者向けのサンプルでは省略されることもありますが、実務ではこのように型チェックを入れておくと安心です。
valueと表示名を分けて管理する
valueには管理しやすい値を入れる
チェックボックスのvalueには、日本語の表示名をそのまま入れることもできます。
<input type="checkbox" name="interests[]" value="Web制作">
ただし、実務ではvalueには英数字の管理用コードを入れ、表示するときに日本語へ変換することが多いです。
例えば、HTML側では次のようにします。
<label>
<input type="checkbox" name="interests[]" value="web">
Web制作
</label>
<label>
<input type="checkbox" name="interests[]" value="seo">
SEO
</label>
<label>
<input type="checkbox" name="interests[]" value="sns">
SNSマーケティング
</label>
このようにしておくと、PHP側で処理しやすくなります。
PHP側で表示名に変換する
PHP側では、送信された値を表示用のラベルに変換します。
<?php
$labels = [
'web' => 'Web制作',
'seo' => 'SEO',
'sns' => 'SNSマーケティング',
];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
if (!empty($interests)) {
echo '選択されたジャンル:<br>';
foreach ($interests as $interest) {
if (isset($labels[$interest])) {
echo htmlspecialchars($labels[$interest], ENT_QUOTES, 'UTF-8') . '<br>';
}
}
} else {
echo '何も選択されていません。';
}
?>
この方法には、次のようなメリットがあります。
- 表示名をPHP側で管理できる
- フォームから送られた値をそのまま表示しなくて済む
- 想定外の値が送られてきた場合に除外できる
- データベースに保存する値を統一しやすい
フォームの値はユーザーが改ざんできるため、送信された値をそのまま信じるのではなく、サーバー側で定義した選択肢と照合することが大切です。
未チェック時の値も受け取りたい場合
hiddenを併用する
チェックボックスは、未チェックの場合に値が送信されません。
しかし、会員情報の編集画面などでは、「チェックされていない」という状態も明示的に受け取りたいことがあります。
例えば、メールマガジンを受け取るかどうかを1または0で保存したい場合です。
そのような場合は、hiddenを併用します。
<form action="confirm.php" method="post">
<input type="hidden" name="mail_magazine" value="0">
<label>
<input type="checkbox" name="mail_magazine" value="1">
メールマガジンを受け取る
</label>
<button type="submit">送信</button>
</form>
この場合、チェックされていないときは、hiddenの値だけが送信されます。
$_POST['mail_magazine'] = '0';
チェックされているときは、hiddenとcheckboxの両方が送信されますが、PHPでは通常、後から送られた値が採用されるため、次のように受け取れます。
$_POST['mail_magazine'] = '1';
そのため、hiddenはチェックボックスより前に書くのが一般的です。
PHPでON/OFFを判定する
PHP側では、次のように受け取ります。
<?php
$mailMagazine = $_POST['mail_magazine'] ?? '0';
if ($mailMagazine === '1') {
echo 'メールマガジンを受け取る';
} else {
echo 'メールマガジンを受け取らない';
}
?>
この方法は、次のようなON/OFF設定でよく使われます。
- メールマガジンを受け取る
- お知らせ通知を受け取る
- プロフィールを公開する
- キャンペーン情報を受け取る
- 管理画面で機能を有効化する
ただし、hiddenで送られる値もユーザーが変更できます。
そのため、受け取った値が0または1であるかをPHP側で確認すると、より安全です。
<?php
$mailMagazine = $_POST['mail_magazine'] ?? '0';
if (!in_array($mailMagazine, ['0', '1'], true)) {
$mailMagazine = '0';
}
?>
チェックボックスに初期値を設定する方法
checked属性を使う
フォームを表示した時点で、最初からチェックを入れておきたい場合はchecked属性を使います。
<input type="checkbox" name="agree" value="1" checked>
HTML5では、checkedだけで有効です。
次のように書いても問題ありません。
<input type="checkbox" name="agree" value="1" checked="checked">
どちらもチェック済みの状態になります。
PHPで保存済みデータに応じてチェックを入れる
会員情報の編集画面などでは、保存済みの値に応じてチェック状態を切り替えることがあります。
例えば、メールマガジンの受信設定が1ならチェック済み、0なら未チェックにしたい場合は、次のように書きます。
<?php
$mailMagazine = '1';
?>
<label>
<input
type="checkbox"
name="mail_magazine"
value="1"
<?php echo $mailMagazine === '1' ? 'checked' : ''; ?>
>
メールマガジンを受け取る
</label>
$mailMagazineが'1'の場合だけ、checkedが出力されます。
複数チェックボックスの初期値を設定する
複数のチェックボックスでは、in_array()を使ってチェック状態を判定します。
<?php
$selectedInterests = ['web', 'seo'];
?>
<label>
<input
type="checkbox"
name="interests[]"
value="web"
<?php echo in_array('web', $selectedInterests, true) ? 'checked' : ''; ?>
>
Web制作
</label>
<label>
<input
type="checkbox"
name="interests[]"
value="seo"
<?php echo in_array('seo', $selectedInterests, true) ? 'checked' : ''; ?>
>
SEO
</label>
<label>
<input
type="checkbox"
name="interests[]"
value="sns"
<?php echo in_array('sns', $selectedInterests, true) ? 'checked' : ''; ?>
>
SNSマーケティング
</label>
この例では、$selectedInterestsにwebとseoが入っているため、「Web制作」と「SEO」にチェックが入ります。
in_array()の第3引数にtrueを指定すると、厳密な比較になります。
意図しない型変換を避けられるため、実務ではtrueを指定するのがおすすめです。
確認画面でチェックボックスの値を保持する方法
入力画面から確認画面へ送信する
問い合わせフォームなどでは、次のような流れを作ることがあります。
- 入力画面
- 確認画面
- 完了画面
確認画面でチェックボックスの値を表示し、さらに完了画面へ送信するには、hiddenを使って値を引き継ぎます。
まず、入力画面では次のようにチェックボックスを用意します。
<form action="confirm.php" method="post">
<p>興味のあるジャンルを選択してください。</p>
<label>
<input type="checkbox" name="interests[]" value="web">
Web制作
</label>
<label>
<input type="checkbox" name="interests[]" value="seo">
SEO
</label>
<label>
<input type="checkbox" name="interests[]" value="sns">
SNSマーケティング
</label>
<button type="submit">確認する</button>
</form>
確認画面で値を表示する
確認画面では、受け取った値を表示します。
<?php
function h($value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
$labels = [
'web' => 'Web制作',
'seo' => 'SEO',
'sns' => 'SNSマーケティング',
];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
$validInterests = [];
foreach ($interests as $interest) {
if (array_key_exists($interest, $labels)) {
$validInterests[] = $interest;
}
}
?>
<form action="complete.php" method="post">
<p>選択されたジャンル:</p>
<?php if (!empty($validInterests)): ?>
<ul>
<?php foreach ($validInterests as $interest): ?>
<li><?php echo h($labels[$interest]); ?></li>
<input
type="hidden"
name="interests[]"
value="<?php echo h($interest); ?>"
>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>何も選択されていません。</p>
<?php endif; ?>
<button type="submit">送信する</button>
</form>
確認画面では、表示するだけでなく、完了画面へ値を送るためにhiddenを出力しています。
<input type="hidden" name="interests[]" value="<?php echo h($interest); ?>">
これにより、確認画面から完了画面へチェックボックスの値を引き継げます。
hiddenの値も再度チェックする
注意したいのは、hiddenの値もユーザーが変更できるという点です。
hiddenは画面上には表示されませんが、ブラウザの開発者ツールなどを使えば値を変更できます。
そのため、確認画面で一度チェックしたからといって、完了画面でのバリデーションを省略してはいけません。
完了画面でも、次のように再度チェックします。
<?php
$labels = [
'web' => 'Web制作',
'seo' => 'SEO',
'sns' => 'SNSマーケティング',
];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
$validInterests = [];
foreach ($interests as $interest) {
if (array_key_exists($interest, $labels)) {
$validInterests[] = $interest;
}
}
if (!empty($validInterests)) {
echo '送信が完了しました。';
} else {
echo 'ジャンルは選択されていません。';
}
?>
確認画面を挟むフォームでは、各画面で必要な検証を行うことが重要です。
チェックボックスのバリデーション
必須チェックを行う
利用規約への同意など、チェックが必須の項目では、PHP側で必須チェックを行います。
<?php
$errors = [];
if (!isset($_POST['agree'])) {
$errors[] = '利用規約に同意してください。';
}
if (!empty($errors)) {
foreach ($errors as $error) {
echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . '<br>';
}
} else {
echo '送信できます。';
}
?>
チェックボックスが未チェックの場合、$_POST['agree']は存在しません。
そのため、isset()を使って判定します。
複数チェックボックスで1つ以上の選択を必須にする
複数のチェックボックスで「1つ以上選択してください」というバリデーションを行う場合は、次のようにします。
<?php
$errors = [];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
if (empty($interests)) {
$errors[] = '興味のあるジャンルを1つ以上選択してください。';
}
if (!empty($errors)) {
foreach ($errors as $error) {
echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . '<br>';
}
} else {
echo '送信できます。';
}
?>
ただし、この時点では「何か値が送られているか」を確認しているだけです。
実務では、送信された値が想定した選択肢に含まれているかも確認しましょう。
送信された値が正しいか検証する
許可リストでチェックする
フォームから送られてきた値は、必ずしもHTMLに書いた選択肢どおりとは限りません。
ユーザーが開発者ツールでvalueを書き換えたり、フォームを通さずに直接リクエストを送信したりする可能性があります。
そのため、PHP側では許可する値の一覧を用意し、送信された値がその中に含まれているか確認します。
<?php
$allowedValues = ['web', 'seo', 'sns', 'ad'];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
$validInterests = [];
foreach ($interests as $interest) {
if (in_array($interest, $allowedValues, true)) {
$validInterests[] = $interest;
}
}
print_r($validInterests);
?>
この処理では、$allowedValuesに含まれている値だけを$validInterestsに入れています。
array_intersectを使って検証する
array_intersect()を使って、許可された値だけを取り出すこともできます。
<?php
$allowedValues = ['web', 'seo', 'sns', 'ad'];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
$validInterests = array_values(array_intersect($interests, $allowedValues));
print_r($validInterests);
?>
ここでは、array_values()も使っています。
array_intersect()は元の配列のキーを保持するため、後続処理で扱いやすくするためにarray_values()でキーを振り直しています。
単にforeachで表示するだけなら大きな問題にならないこともありますが、配列を整えておきたい場合はarray_values()を使うとよいでしょう。
出力時はhtmlspecialcharsでエスケープする
フォームの値をそのまま表示しない
フォームから受け取った値をHTMLに表示する場合は、htmlspecialchars()を使ってエスケープします。
echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
これは、XSS対策として重要です。
例えば、ユーザーが不正なHTMLやJavaScriptを含む値を送信した場合、その値をそのまま画面に出力すると、意図しないスクリプトが実行される可能性があります。
チェックボックスの値であっても、ユーザーが送信内容を改ざんできる以上、表示時にはエスケープするのが基本です。
エスケープ用の関数を作る
htmlspecialchars()は何度も使うため、関数化しておくと便利です。
<?php
function h($value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
?>
使うときは、次のように書けます。
echo h($interest);
表示名を出力する場合も同じです。
echo h($labels[$interest]);
このように関数化しておくと、コードが読みやすくなります。
実務で使いやすいサンプルコード
入力画面のコード
最後に、実務で使いやすい形のサンプルを紹介します。
まずは、入力画面です。
<?php
function h($value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
$interestOptions = [
'web' => 'Web制作',
'seo' => 'SEO',
'sns' => 'SNSマーケティング',
'ad' => '広告運用',
];
?>
<form action="confirm.php" method="post">
<p>興味のあるジャンルを選択してください。</p>
<?php foreach ($interestOptions as $value => $label): ?>
<label>
<input type="checkbox" name="interests[]" value="<?php echo h($value); ?>">
<?php echo h($label); ?>
</label>
<br>
<?php endforeach; ?>
<button type="submit">確認する</button>
</form>
選択肢を配列で管理しているため、チェックボックスを追加・変更したい場合も、$interestOptionsを編集するだけで済みます。
受け取り画面のコード
次に、受け取り画面です。
<?php
function h($value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
$interestOptions = [
'web' => 'Web制作',
'seo' => 'SEO',
'sns' => 'SNSマーケティング',
'ad' => '広告運用',
];
$errors = [];
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
$validInterests = [];
foreach ($interests as $interest) {
if (array_key_exists($interest, $interestOptions)) {
$validInterests[] = $interest;
}
}
if (empty($validInterests)) {
$errors[] = '興味のあるジャンルを1つ以上選択してください。';
}
?>
<?php if (!empty($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo h($error); ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>選択されたジャンル:</p>
<ul>
<?php foreach ($validInterests as $interest): ?>
<li><?php echo h($interestOptions[$interest]); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
このコードでは、次のような対策を入れています。
- 未選択の場合にエラーにならない
- 配列以外の値が送られた場合に空配列へ変換する
- 許可された選択肢だけを採用する
- 表示名はサーバー側の配列から取得する
- 出力時に
htmlspecialchars()でエスケープする
チェックボックスの値を安全に扱うための基本が入ったサンプルです。
よくあるミス
name属性に[]を付け忘れる
複数のチェックボックスでよくあるミスが、name属性に[]を付け忘れることです。
<input type="checkbox" name="interests" value="web">
<input type="checkbox" name="interests" value="seo">
<input type="checkbox" name="interests" value="sns">
このように書くと、複数選択を配列として受け取りにくくなります。
複数の値を受け取りたい場合は、次のように書きます。
<input type="checkbox" name="interests[]" value="web">
<input type="checkbox" name="interests[]" value="seo">
<input type="checkbox" name="interests[]" value="sns">
[]を付けることで、PHP側では$_POST['interests']を配列として扱えます。
未チェック時にも値があると思ってしまう
チェックボックスは、未チェックの場合に値が送信されません。
そのため、次のような書き方は避けましょう。
if ($_POST['agree'] === '1') {
echo '同意済み';
}
未チェックの場合、$_POST['agree']が存在しないため、警告が出る可能性があります。
安全に書くなら、次のようにします。
if (isset($_POST['agree']) && $_POST['agree'] === '1') {
echo '同意済み';
}
または、??を使って次のように書けます。
$agree = $_POST['agree'] ?? '';
if ($agree === '1') {
echo '同意済み';
}
value属性を設定しない
チェックボックスにvalue属性を設定しない場合、チェックされていると既定値としてonが送信されます。
<input type="checkbox" name="agree">
この場合、PHP側では次のように受け取ることがあります。
$_POST['agree'] = 'on';
動作自体はしますが、実務では意味が分かりやすい値を明示した方がよいです。
<input type="checkbox" name="agree" value="1">
または、次のように書くと意図が分かりやすくなります。
<input type="checkbox" name="mail_magazine" value="yes">
valueを明示しておくことで、PHP側の処理も読みやすくなります。
hiddenの値を安全だと思ってしまう
hiddenは画面に表示されないため、安全な値だと思われがちです。
しかし、hiddenの値もユーザーが変更できます。
そのため、次のようなフォームで送られてきた値も、そのまま信用してはいけません。
<input type="hidden" name="mail_magazine" value="0">
<input type="checkbox" name="mail_magazine" value="1">
PHP側では、受け取った値が想定した値か確認しましょう。
$mailMagazine = $_POST['mail_magazine'] ?? '0';
if (!in_array($mailMagazine, ['0', '1'], true)) {
$mailMagazine = '0';
}
特に、料金、権限、公開設定、登録情報などに関わる値は、必ずサーバー側で検証する必要があります。
まとめ
PHPでチェックボックスを受け取る基本
PHPでチェックボックスの値を受け取る基本は、次のとおりです。
1つのチェックボックスの場合は、isset()で送信されているか確認します。
if (isset($_POST['agree'])) {
echo 'チェックされています';
}
値を取得したい場合は、??を使うと安全です。
$agree = $_POST['agree'] ?? '';
複数のチェックボックスを受け取る場合は、HTML側でname="xxx[]"のように書きます。
<input type="checkbox" name="interests[]" value="web">
<input type="checkbox" name="interests[]" value="seo">
<input type="checkbox" name="interests[]" value="sns">
PHP側では配列として受け取ります。
$interests = $_POST['interests'] ?? [];
if (!is_array($interests)) {
$interests = [];
}
チェックボックスで重要なポイント
チェックボックスを扱うときは、次の点を押さえておくことが大切です。
- チェックされている場合だけ値が送信される
- 未チェックの場合は項目自体が送信されない
- 1つのチェックボックスは
isset()で判定する - 複数のチェックボックスは
name="xxx[]"で配列として受け取る $_POST['name']を直接参照せず、??やisset()を使う- 送信された値が配列かどうか確認する
- 送信された値が許可された選択肢か確認する
- 表示時は
htmlspecialchars()でエスケープする - 未チェック時の値も必要なら
hiddenを併用する hiddenの値も改ざんできるため、PHP側で再度検証する
特に重要なのは、チェックボックスは未チェックだとPHPに値が渡らないという点です。
この仕様を理解しておけば、Undefined array keyの警告を避けられ、複数選択や確認画面を含むフォームも安全に実装しやすくなります。
以上、PHPでチェックボックスの値を受け取る方法についてでした。
最後までお読みいただき、ありがとうございました。










