MW211 EXIT

devlog
PHP/一覧中のチェックボックスの処理
2011年09月20日
┌──────────────────────────────────────┐
│┌─┬────┬──────────────┬──────┬───┬────│
││№│  氏名  │            住所            │  電話番号  │ 区分 │        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 1│武田信玄│                            │            │■源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 2│上杉謙信│                            │            │□源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 3│徳川家康│                            │            │■源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
└──────────────────────────────────────┘
上記のような、(複数)明細を入力する画面で、同一列の項目を入力させるには
以下のようにname属性に「[]」をつけて配列にしてあげればいい。
┌──────────────────────────────────┐
│<input type="text" name="氏名[]" value="値"/>                       │←1行目
│<input type="text" name="氏名[]" value="値"/>                       │←2行目
│<input type="text" name="氏名[]" value="値"/>                       │←3行目
└──────────────────────────────────┘
するとPOST後、以下のように配列で値を取得できる。
・$_POST['氏名'][0]  →1行目に入力された氏名  →武田信玄
・$_POST['氏名'][1]  →2行目に入力された氏名  →上杉謙信
・$_POST['氏名'][2]  →3行目に入力された氏名  →徳川家康

しかしこれがチェックボックスの場合は厄介なことになる。
┌──────────────────────────────────────┐
│<input type="checkbox" name="区分[]" value="TRUE" checked="checked"/>       │
│<input type="checkbox" name="区分[]" value="TRUE"/>                         │
│<input type="checkbox" name="区分[]" value="TRUE" checked="checked"/>       │
└──────────────────────────────────────┘
上記のように、テキスト同様定義してあげて、
チェックの有無により以下のように配列で取得できればよいのだが…
・$_POST['区分'][0]  →1行目はチェックあり  →TRUE
・$_POST['区分'][1]  →2行目はチェックなし  →FALSE
・$_POST['区分'][2]  →3行目はチェックあり  →TRUE

実際には以下のようにチェックなしは、その存在自体が無視されてしまう。
・$_POST['区分'][0]  →1行目はチェックあり  →TRUE
・$_POST['区分'][1]  →3行目はチェックあり  →TRUE
(結果的には「■□■」と入力したものが「■■-」と認識される感じだ)

これでは不都合なので、以下のように対処する。

まず、各行にキーとなるものを定義しておき、チェックボックスのvalue属性に設定。
┌──────────────────────────────────────┐
│<input type="checkbox" name="区分[]" value="キー1" checked="checked"/>      │
│<input type="checkbox" name="区分[]" value="キー2"/>                        │
│<input type="checkbox" name="区分[]" value="キー3" checked="checked"/>      │
└──────────────────────────────────────┘
ちなみにキーは以下のような感じで設定しておく。
┌──────────────────────────────────────┐
│<input type="hidden" name="キー[]" value="キー1"/>                          │
│<input type="hidden" name="キー[]" value="キー2"/>                          │
│<input type="hidden" name="キー[]" value="キー3"/>                          │
└──────────────────────────────────────┘

これらは、行ごとに一組になる感じだ。
┌──────────────────────────────────────┐
│<input type="hidden" name="キー[]" value="キー1"/>                          │
│<input type="checkbox" name="区分[]" value="キー1" checked="checked"/>      │
└──────────────────────────────────────┘

それで、以下のように判定すれば、
チェックありの場合はTRUE、チェックなしの場合はFALSEに判定することができる。
・in_array($_POST['キー'][0], $_POST['区分'])
・in_array($_POST['キー'][1], $_POST['区分'])
・in_array($_POST['キー'][2], $_POST['区分'])

注意:全ての明細がチェックボックスをはずしている場合には、
      「$_POST['区分']」自体が存在しないことになり
      「in_array()」が成立せずエラーとなってしまうので
      条件分岐などの考慮が必要です
      以下みたいな感じでしょうか
┌──────────────────────────────────────┐
│if (isset($_POST['区分'])) {                                                │
│  return in_array($_POST['キー'][0], $_POST['区分']);                       │
│} else {                                                                    │
│  return FALSE;                                                             │
│}                                                                           │
└──────────────────────────────────────┘

#わかりやすいように変数名を日本語にしていますが、実際は英語です
#POST送信を例にしています、GETでも同じです
分類:PHP