shokun1209
@shokun1209 (s shoya)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravel 問い合わせフォームでのcheckboxの扱い方について

解決したいこと

複数のcheckboxから値を取得し、確認画面へ表示させる。
値は数値で取得し、表示は文字列としたい。
最終的に数値でDBに保存したいと考えている。

// コントローラー

class ContactController extends Controller
{
    public function index(){
        return view('contact.fruits1');
    }
    public function confirm(Request $request)
    {
        $inputs = $request->all();

// 選択されたcheckboxの値複数を取ってくる
        $checkbox = $request->input('checkbox');

// $checkboxが取ってきた値は1,2,3...と数値なので、表示する文字列に変えたい
        $fruits = [
            1 => 'りんご',
            2 => 'みかん',
            3 => 'ぶどう',
            4 => 'もも',
            5 => 'ばなな',
        ];

// 最終的に表示したい形式
// このままでは全て表示されてしまうので$checkboxで取ってきた値のみ表示したい
        $fruits2 = [
            'りんご',
            'みかん',
            'ぶどう',
            'もも',
            'ばなな',
        ];

        //内容確認ページfruits2に入力情報を渡したい
        return view('contact.fruits2', [
            'inputs' => $inputs,
            'checkbox' => $checkbox,
            'fruits2' => $fruits,
        ]);
    }
<!-- view contact.fruits1 -->

<form id="fuga" action="/complete" name="search" method="post">
<dd id="form_select">
<input type="checkbox" name="checkbox[]" value= 1 id="Group1_1" class="checkbox01" /><label for="Group1" class="check_label">りんご</label>

<input type="checkbox" name="checkbox[]" value= 2 id="Group1_1" class="checkbox01" /><label for="Group1" class="check_label">みかん</label>

<input type="checkbox" name="checkbox[]" value= 3 id="Group1_1" class="checkbox01" /><label for="Group1" class="check_label">ぶどう</label>

<input type="checkbox" name="checkbox[]" value= 4 id="Group1_1" class="checkbox01" /><label for="Group1" class="check_label">もも</label>

<input type="checkbox" name="checkbox[]" value= 5 id="Group1_1" class="checkbox01" /><label for="Group1" class="check_label">ばなな</label>
</dd>
...

</form>

<button type="submit" form="fuga" class="sbmit">送信</button>

<!-- view contact.fruits2 -->

<p class="confirm">
@foreach()
{{  }}
@endforeach
<input name="checkbox[]" value="{{  }}" type="hidden">
</p>

<!-- この後完了画面へ -->

自分で試したこと

valueを 'りんご' 等にしてしまえば表示はできるのですが、最終的にDBに数値で保存したいと考えています。
頭の悪い私にヒント等ご教授頂けませんでしょうか…

よろしくお願いいたします:bow_tone1:

0

1Answer

表示と保存は分けて考えて良いと思います。

選択した値が$fruitsなどの配列に含まれるか?というのは
例えばin_array()array_key_exists()を使うことで判断ができます。

保存についですが、いわゆる確認画面から<input type="hidden">で値を送信するのはおすすめできません。

フォームは「ユーザが入力しやすくする」ものであって、正しい入力を保証するものではありません。
知識がある人ならhiddenで隠しても簡単に変更できます。
ですので、まず正しくない値や悪意がある値が送信されてくると考え、それを検証(バリデーション)する必要があります。

そして、検証したデータをまたフォームに戻してしまうと意味がなくなってしまうので、
そういう場合はセッションを使います。

入力されたデータを検証(バリデーション)し、想定通りのデータなら一時的にセッションに入れる、という形でデータを渡していきます。

もし学習の途中であればいったん無視して段階的に学習していけば良いですが、
不特定多数に公開するのなら必要になってきます。

1Like

Comments

  1. @shokun1209

    Questioner

    @blue32a 様
    まず初めに、諸事情にて返信が出来ずにいた事をお詫び申し上げます🙇‍♂️

    以前にも増してご丁寧な回答ありがとうございます。
    JavaScriptの件では大変お世話になりました。

    blue32a様の仰る通り、表示と保存を分けて考える事と致しました。
    type hiddenについては、これまた仰る通りセキュリティ上よろしくないという記事を散見しておりましたが、お察しの通り学習の段階でしたのでとりあえずの実装という形で進めておりました。



    私事ですが、念願のプログラマーへの転職が実現しました。
    blue32a様をはじめqiitaの優しい皆様に御助言頂けたおかげで学習を続けられた事がとても大きかったと思っております。
    まだまだスタートラインに立ったばかりですが、いつか自分もblue32a様のように、今の自分のような立場の方に適切な助言が出来るようにこれからも精進して参ります。

    本当にありがとうございました。
  2. おめでとうございます。
    私も勉強として回答しているので拙い回答も多いですが、
    お役に立てたのなら幸いです。
    頑張ってください。

Your answer might help someone💌