1. 4cres

    No comment

    4cres
Changes in body
Source | HTML | Preview
@@ -1,130 +1,137 @@
+**2017年1月追記**
+Googleのアクセス解析を見たら、僕が書いた記事の中で、意外にもこの記事が一番アクセス数が多いです。
+全然「いいね」「ストック」もされてませんが、この記事だけで月間2,000ページビュー以上あります。
+おそらく、Qiitaユーザーでもない通りすがりの方が見てくれているのかと思います。
+**この記事を読んでもわからないことがあれば、コメントください。**
+**それにあわせて、記事をアップデートします**
+
#はじめに
これは駄文である。
こんな記事を見るのに時間を使うなら mpyw 氏の「
[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」を見た方が有意義ですよ。
とりあえず、初学者が初学者に向けて説明してみる。
#チェックボックスの値はどのように取得するの?
チェックボックスの値は、配列でくるよ。
このようなチェックボックスがあると仮定。
```
<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>
```
`$_POST['food']`にチェックボックスの値が配列として格納されているから、変数に代入すればいいだけ。
```
<?php
$food = $_POST['food'];
```
既に配列になっているので、for文とか使う必要ないよ。
試しに`$food`を`var_dump($food)`してみると下記のように配列になってるよ。
```
array(3) {
[0]=>
string(6) "寿司"
[1]=>
string(9) "天ぷら"
[2]=>
string(6) "芸者"
}
```
ここではわかりやすくするために、`$_POST['food']`の値をそのまま`$food`という変数にぶち込んでますが、これは絶対ダメ。
私の駄文を見に来る方は、超初心者だと思う(なぜなら私が超初心者だから)ので、あえて説明する。
[MDN](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Forms/Sending_and_retrieving_form_data)の最後の方に書いてある通り、ユーザーから送られてくるデータは信用してはいけません。
下記の引用にある通り、必ずデータはチェックすること。
> サーバに来るすべてのデータを確認およびサニタイズ(※1)しなければなりません。<ins>いつでもです。例外はありません。</ins>
例外はない。絶対だ。
繰り返す。例外はない。絶対だ。
え?「JQueryで入力チェックしてます(キリッ 」だって・・・
クライアント側で入力チェックしても意味はない。(利便性が向上するという点では意味ある)
必ずサーバー側(PHP)で確認しろ。絶対だ。
<b>※1 サニタイズという用語について神様からコメント頂いたので、そちらも見てね。</b>
#じゃあどうやって確認するの?
チェックの仕方は、最初に紹介した mpyw 氏の「
[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」を見てもらうのが一番。
なぜなら、私は超初心者だから。
言い訳も済んだので、確認の仕方を説明しようと思う。
説明に誤りがあれば、ご指摘お願いします((_ _ (´ω` )ペコ
データを確認するのに`isset`と`is_array`を使おう。
`isset`では未定義またはNULLではないことを確認。
`is_array`では配列かどうか確認。
組み合わせるとこんな感じ。
```
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
$food = $_POST['food'];
}
```
未定義またはNULLではなく、配列だった場合に`$food`に`$_POST['food']`を代入してるよ。
これでチェックボックスの値が受け取れたよ。
ただ、配列って`=>`こんな記号使うし難しいんですよ。(おい!覚えろよ)
難しい配列やめて文字列にしちゃおう。
#どうやって文字列にするの?
`implode`を使えばOK。
```
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
$food = implode("、", $_POST["food"]);
}
```
これで `、` で区切った文字列になるよ。
`寿司、天ぷら、芸者`のような文字列だよ。
おしまい。
あっ!この記事では確認のところしか説明してないよ。
> サーバに来るすべてのデータを確認および<ins>サニタイズ(※1)</ins>しなければなりません。いつでもです。例外はありません。
サニタイズもしましょうね。
サニタイズってなんぞやって方は、調べてね。
おしまい。
<b>※1 サニタイズという用語について神様からコメント頂いたので、そちらも見てね。</b>