毎回忘れてしまうので記録として残します。

PHPでフォームシステムを作っているとき、たまにcheckboxボタンで複数選択して登録するときがあります。

大体は一つの項目を一つのDBカラムに登録すると思うのですが、checkboxボタンで選択した場合はそのままでは登録できません。

ちなみに、複数選択させたい場合は以下のようにname[]の設定をちょっと工夫する必要があります。

 

<input type=”checkbox” name=”check[]” value=”1″ />
<input type=”checkbox” name=”check[]” value=”2″ />
<input type=”checkbox” name=”check[]” value=”3″ />

// 例: 1と3を選択してPOSTした場合
var_dump($_POST[“check”]) → array{[0] => [“1”],[1] => [“3”]}

 

配列データをそのままDBに保存するとエラーが発生してしまいます。

そのため、配列データは一度文字データに変換してから保存することにします。

また、選ばれてない場合、POSTのデータには存在しないため、普通に保存の処理をしようとするとデータが無いよと弾かれる恐れをさけるため、DBにNULLを許可していない場合、何かしらのデータを加える処理も必要になります。

今回はcakePHPを利用しての構築を例に残します。

 

// 選択されているかをチェック
// データが空でない場合
if($this->request->data['Member']['hobby'] != ''){
  // implodeでCSV化。逆はexplode。
  $csv = implode(',',$this->request->data['Member']['hobby']);
  // 値をオーバーライド
  $this->request->data['Member']['hobby'] = $csv;
} else {
  // 何も選択されていない場合
  // 空データを代入
  $this->request->data['Member']['hobby'] = '';
}

 

もし、保存したいデータが連想配列の場合はimplode()、explode()ではなく、serialize()、unserialize()の方を使うと良さそうです。