Help us understand the problem. What is going on with this article?

【PHP】チェックボックスの値を受け取る

2017年1月27日追記
Googleのアクセス解析を見たら、僕が書いた記事の中で、意外にもこの記事が一番アクセス数が多いです。
全然「いいね」や「ストック」もされてませんが、この記事だけで月間2,000ページビュー以上あります。
おそらく、Qiitaユーザーでもない通りすがりの方が見てくれているのかと思います。
今まで覚書のように要点のみ書いていましたが、アクセスする方も多いので、より詳説に書き直しました。
この記事を読んでもわからないことがあれば、コメントください。

そもそもPOSTやGETって何?

POSTやGETについて理解していない方は、下記が参考になります。

チェックボックスを配列にするには?

HTML側で name を記述するときに [] を最後に付けると配列になります。
下記のように food[] のようにします。

html
<h2>好きな食べものは?</h2>
<form method="post" action="">
    <input type="checkbox" name="food[]" value="寿司"> 寿司 
    <input type="checkbox" name="food[]" value="天ぷら"> 天ぷら 
    <input type="checkbox" name="food[]" value="芸者"> 芸者 
</form>

チェックボックスの値はどのように取得するの?

[] を付けることで、PHP側で配列として受け取れます。
先ほどと同じように下記の HTML があったとします。

html
<h2>好きな食べものは?</h2>
<form method="post" action="">
    <input type="checkbox" name="food[]" value="寿司"> 寿司 
    <input type="checkbox" name="food[]" value="天ぷら"> 天ぷら 
    <input type="checkbox" name="food[]" value="芸者"> 芸者 
</form>

methodpost と記述しておりますので、postメソッドで送られてきます。
postメソッドについて理解していない方は、先ほどの 【PHP超入門】HTTP(GET・POST)について をご覧ください。
$_POST['food'] にチェックボックスの値が配列として格納されています。
それを下記のように変数に代入するだけでチェックボックスの値を受け取れます。

php
<?php
$food = $_POST['food'];

既に配列になっているので、変数に代入するときにfor文とか使う必要はありません。
試しに先ほどの変数 $foodvar_dump($food) してみると下記のように配列になっているのが確認できます。

php
array(3) {
  [0]=>
  string(6) "寿司"
  [1]=>
  string(9) "天ぷら"
  [2]=>
  string(6) "芸者"
}

ここではわかりやすくするために、$_POST['food'] の値をそのまま $food という変数に代入しましたが、この方法はダメです。
なぜなら、GETやPOSTなどで送られくる値は、偽装可能なためです。
チェックボックスやプルダウンだと、こちらで用意した値した送られてこないと思いがちですが、GETやPOSTなどで送られくる値は、全て偽装可能なため信用できません。
先ほどの例で言うと、寿司、天ぷら、芸者 以外の値が送られてくることもあります。
そこら辺についても 【PHP超入門】HTTP(GET・POST)について で説明されているので、理解していない方はご覧ください。

じゃあどうやって確認するの?

値のチェックの仕方は、 mpyw 氏の「
$_GET, $_POSTなどを受け取る際の処理」が詳説ですが、僕なりに説明してみます。

今回、配列として受け取ります。
受け取るときに未定義またはNULLではないか、また配列かどうかを確認します。
未定義またはNULLではないかを確認するには isset() 関数を使います。
配列かどうかは is_array() 関数を使います。
if文を使い、値を確認し、未定義でもNULLでもなく、配列だった場合に $food = $_POST['food']; として値を受け取ります。

php
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
    $food = $_POST['food'];
}

配列はアロー演算子 => を使うので、少し難しいです。
配列を文字列にすることもできます。

どうやって文字列にするの?

implode関数使えば、配列を文字列にしてくれます。
受け取るときにimplode関数を使いましょう。

php
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
    $food = implode("、", $_POST["food"]);
}

これで で区切った文字列として受け取れます。
全てにチェックがあった場合は 寿司、天ぷら、芸者 という文字列として受け取ります。

一番伝えたいこと

この記事を見てる方は、メールフォームや掲示板などのWebアプリケーションを作りたいと考えている初学者の方かと思います。
Webアプリケーションを作るのにセキュリティ対策が欠かせません。
先ほど紹介した下記は必ず見るようにしてください。

セキュリティに関して体系的に学びたいなら、下記の書籍がお勧めです。

セキュリティ対策について、必ず学ぶようにしてください。

4cres
せっせと駄文を量産してます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした