毎回忘れてしまうので記録として残します。
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()の方を使うと良さそうです。