1. 4cres

    Posted

    4cres
Changes in title
+【PHP】チェックボックスの値を受け取る
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,126 @@
+#はじめに
+
+これは駄文である。
+
+こんな記事を見るのに時間を使うなら mpyw 氏の「
+[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」を見た方が有意義ですよ。
+
+Qiita徘徊者、もしくは、この説明はダメだっぺとご指摘くださる神様のみどうぞ。
+
+#チェックボックスの値はどのように取得するの?
+
+チェックボックスの値は、配列でくるよ。
+
+このようなチェックボックスがあると仮定。
+
+```
+<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)の最後の方に書いてある通り、ユーザーから送られてくるデータは信用してはいけません。
+
+下記の引用にある通り、必ずデータはチェックすること。
+
+> サーバに来るすべてのデータを確認およびサニタイズしなければなりません。<ins>いつでもです。例外はありません。</ins>
+
+例外はない。絶対だ。
+
+繰り返す。例外はない。絶対だ。
+
+え?「JQueryで入力チェックしてます(キリッ 」だって・・・
+
+クライアント側で入力チェックしても意味はない。(利便性が向上するという点では意味ある)
+
+必ずサーバー側(PHP)で確認しろ。絶対だ。
+
+#じゃあどうやって確認するの?
+
+チェックの仕方は、最初に紹介した 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>サニタイズ</ins>しなければなりません。いつでもです。例外はありません。
+
+サニタイズもしましょうね。
+
+サニタイズってなんぞやって方は、調べてね。
+
+おしまい。