質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.21%

ループで表示しているチェックボックスで複数選択した値をデータベースに送信する

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,887

nyowaa

score 13

二回目の質問になります。よろしくお願いいたします。

前提・実現したいこと

前回質問した質問と同じシステムなのですが、タイトルにもあります通り、ループして表示しているチェックボックスで複数の項目をチェックした値をデータベースに送信したいと思っております。
そこでお伺いしたいことなのですが、このコードをご覧ください。

send.php データベースに送る際のphpです↓

//データ件数をカウント、変数dataに代入
$recordSet = mysqli_query('SELECT COUNT(id) FROM dish);
$data = mysqli_fetch_assoc($recordset);

$id = $data['count(id)']+1;
$dishId = $_POST['menuId'];
$dishMenu1 = implode('',$_POST['dishMenu1']);
$dishMenu2 = implode('',$_POST['dishMenu2']);
$dishMenu3 = implode('',$_POST['dishMenu3']);
$dishMenu4 = implode('',$_POST['dishMenu4']);

//書き込み部分
mysqli_query('INSERT INTO dish SET id="'.$id.'",dishId="'.$dishId.'",dishMenu1="'.$dishMenu1.'",dishMenu2="'.$dishMenu2.'",dishMenu3="'.$dishMenu3.'",dishMenu4="'.$dishMenu4.'"') or die(mysqli_error());


チェックボックスのみなら、このコードで問題ないとは思うのですが、こちらのコードをご覧ください。
menu.php フォーム部分のPHPです

for($j=1; $j<=10; $j++){
        if($col['format']==$frmtR){
        //radio
            if($col['dish'.$j]){
                if($col['required'.$k]){
                    echo"<input required type='radio' name='menu{$menu_count}' id='menu{$menu_count}'value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>';
                }else{
                    echo"<input type='radio' name='menu{$menu_count}' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>';
                }
            }
        }elseif($col['format']==$frmtC){
        //checkbox
            if($col['dish'.$j]){
                if($col['required'.$k]){
                        echo"<input reqired type='checkbox' name='menu{$menu_count}[]' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>';
                }else{
                        echo"<input type='checkbox' name='menu{$menu_count}[]' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>';
                }
            }
}


このように、for文とif文を使って、ラジオボタンまたはチェックボックスの条件をデータベースから取得してきております。これだと、send.phpのほうでimplodeをしていると、ラジオボタンが上手に取得できなくなり、困っております。

試したこと

implodeの他にできるものはないかと調べたのですが、全く検索が引っかからずに困っておりました。
また、implodeを外して、nameの部分に[]のみをつけた状態でフォームを送信してみたところ、テーブルのレコード部分に「array」という文字のみが表示されてしまいました。

追記

format はデータベースにあります、選択項目(ラジオボタンやチェックボックス)を取得するための値が入っているidとなっております。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" ;/>
<link href="css/questionStyle.css" type="text/css" rel="stylesheet">

<title>アンケート</title>
</head>
<body>
<form action ="send.php" method="post" id="form"><h1 align="center">test</h1>
<hr><div class="question" align="center"><p>1.test</p>
<p align="left" style="display:inline-block;">
<input type='checkbox' name='dishMenu1[]' id='dishMenu1' value='うああ'>うああ<br>
<input type='checkbox' name='dishMenu1[]' id='dishMenu1' value='うおおお'>うおおお<br>
<input type='checkbox' name='dishMenu1[]' id='dishMenu1' value='ふみゅ'>ふみゅ<br>
<input type='checkbox' name='dishMenu1[]' id='dishMenu1' value='ふ'><br>
<input type='checkbox' name='dishMenu1[]' id='dishMenu1' value='ぐ'><br>
sonota<input type='text' name='dishMenu2' id='dishMenu2' value=''>
<input type='hidden' name='question_id' value='1'></p></div><div align="right">
<input type="submit" value="送信する" id="send" name="send" style="width:100px; height:30px;">
</div>
</form>
</body>
</html>

何度も修正申し訳ありません

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nobinobi

    2016/12/06 15:15

    なぜ前回の質問が終わってないのにこちらに立てたのでしょう?内容も同じように見受けられますが?

    キャンセル

  • nyowaa

    2016/12/06 16:04

    コメントありがとうございます。前回の質問は、一つのテーブルのidの値を、別のテーブルにフォームで送信する方法でした。今回の質問は、ループしているチェックボックスで、複数選択したものをどのようにしてデータベースに値を送るかでした。言葉足らずで申し訳ありません。ですが、考えてみると同じような質問ですね、申し訳ありません。

    キャンセル

  • nyowaa

    2016/12/06 16:05

    一つの質問が解決してから、次の質問をすべきでした……

    キャンセル

  • nobinobi

    2016/12/06 17:58

    いえ、ループが肝要な部分であれば私の認識違いかもしれません。申し訳ありません。

    キャンセル

回答 2

checkベストアンサー

+2

関係ないかもしれませんが、idをインクリメントするなら
オートインクリメントにすればよいのでは?
現行の方法にこだわるとしてもSQLで特殊な文字は別名をつけた方がよいでしょう

$recordSet = mysqli_query('SELECT COUNT(id) as count_id FROM dish);
・・・
$id = $data['count_id']+1;

フロー的にはfilter処理をすればきれいに収まるとおもいます

<?PHP
$id="hoge";
$dishId    = filter_input(INPUT_POST,'dishId',FILTER_DEFAULT,["options"=>["default"=>""]]);
$dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]]));
$dishMenu2 = implode('、',filter_input(INPUT_POST,'dishMenu2',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]]));
$dishMenu3 = implode('、',filter_input(INPUT_POST,'dishMenu3',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]]));
$dishMenu4 = implode('、',filter_input(INPUT_POST,'dishMenu4',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]]));
print 'INSERT INTO dish SET id="'.$id.'",dishId="'.$dishId.'",dishMenu1="'.$dishMenu1.'",dishMenu2="'.$dishMenu2.'",dishMenu3="'.$dishMenu3.'",dishMenu4="'.$dishMenu4.'"';
?>
<hr>
<form method="post">
dishMenu1<br>
<input type="checkbox" name="dishMenu1[]" value="1">1
<input type="checkbox" name="dishMenu1[]" value="2">2
<input type="checkbox" name="dishMenu1[]" value="3">3<br>
dishMenu2<br>
<input type="checkbox" name="dishMenu2[]" value="x">x
<input type="checkbox" name="dishMenu2[]" value="y">y
<input type="checkbox" name="dishMenu2[]" value="z">z<br>
<input type="submit" value="go">
</form>

 修正

まず、新たにご提示されたソースの中でidがユニークでない箇所が散見されます
つかってないidにようにみえるのでなくていいんじゃないでしょうか?
あとはdishMenu2はcheckboxではなさそうなのでfilterの仕方がちょっと変わってきます

<form method="post">
<div class="question" align="center">
<p align="left" style="display:inline-block;">
<input type='checkbox' name='dishMenu1[]' value='うああ'>うああ<br>
<input type='checkbox' name='dishMenu1[]' value='うおおお'>うおおお<br>
<input type='checkbox' name='dishMenu1[]' value='ふみゅ'>ふみゅ<br>
<input type='checkbox' name='dishMenu1[]' value='ふ'><br>
<input type='checkbox' name='dishMenu1[]' value='ぐ'><br>
sonota<input type='text' name='dishMenu2' value=''>
<input type='hidden' name='question_id' value='1'></p></div>
<div align="right">
<input type="submit" value="送信する" style="width:100px; height:30px;">
</div>
</form>

<?PHP
$dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,array("flags"=> FILTER_REQUIRE_ARRAY,"options"=>array("default"=>array()))));
$dishMenu2 = filter_input(INPUT_POST,'dishMenu2',FILTER_DEFAULT,array("options"=>array("default"=>"")));
print $dishMenu1;
print "<hr>";
print $dishMenu2;
?>

 追記

送られてきたものが配列かどうか確認して変数に代入する

$dishMenu1 = getPostData('dishMenu1');
$dishMenu2 = getPostData('dishMenu2');
print $dishMenu1;
print "<hr>";
print $dishMenu2;

function getPostData($key){
  if(isset($_POST[$key])){
    if(is_array($_POST[$key])){
      $ret=implode("、",$_POST[$key]);
    }else{
      $ret=$_POST[$key];
    }
  }else{
    $ret="";
  }
  return $ret;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/12 15:45

    dishMenu1が送られてきたものをチェックするのであれば
    filter_inputにdefaultを指定せず、is_arrayでしらべた上で配列ならimplodeする
    そうでなければそのままの値を取るということでよいでしょう。

    むしろ送られてくるものがラジオボタンなのかチェックボックスなのか
    その他なのかは重要ではありません。
    配列で送られてくるものとしては、チェックボックスは顕著ですが
    セレクトボックスだってありえますし、通常のテキストボックスの可能性もあります

    キャンセル

  • 2016/12/12 15:56

    issetとis_arrayでチェックする例を上げておきます

    キャンセル

  • 2016/12/13 14:16

    ありがとうございます!issetとis_arrayを使う方法を試させていただきましたところ、無事実行ができました!
    お忙しいところ大変ありがとうございました。
    ベストアンサーとさせていただきました!

    キャンセル

+2

まずはループで取得している値を確認してみて下さい。

ループしている値を"echo"や"var_dump"で出力してみてください。

for($j=1; $j<=10; $j++){
          echo '$j : '.$j.'=> $col[\'format\'] : '.$col['format'].'<br>';
}


値が意図通りに取れていれば問題は分岐にあり、比較対象、もしくは比較方法そのものに問題がある可能性が高いです。


加筆(認識違いな気がしたので・・・)

implode部分が上手くいかず”query発行にて問題がある”とすれば単純に入力値の問題です。
implodeでダメならDBのフィールドの型と値が合っているか、キチンとエスケープしてqueryが壊れていないかなど、query部分を検証するのが良いかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/07 11:26

    追記文確認致しました。
    ではfomat部には問題ないという認識でいきます。

    次は
    $dishMenu1 = implode('、',$_POST[dishMenu1]);
    $dishMenu2 = implode('、',$_POST[dishMenu2]);
    $dishMenu3 = implode('、',$_POST[dishMenu3]);
    $dishMenu4 = implode('、',$_POST[dishMenu4]);

    ですが、dishMenu1~dishMenu4はdefineで定義されているのでしょうか?
    ここのkeyを生成する部分はどのようになっているのでしょう。

    キャンセル

  • 2016/12/08 11:18

    ありがとうございます!
    変数はdefineで定義しておりません。
    申し訳ありません、keyとはどのようなものでしょうか?

    キャンセル

  • 2016/12/08 11:38

    単純に「implode('、',$_POST[dishMenu1]);」ですと$_POST[dishMenu1]がエラーになりますので、dishMenu1を「'dishMenu1'」ではないのかと思った次第です。
    まずは$_POSTの中身がどうなっているのか、また実行するquery文を画面かファイルに出力してphpmyadminもしくはコマンドにてmysqlに投げてみて結果を教えてください。
    別件にはなりますが、編集頂いた1行目に ' が足りてないかと。
    また、そもそもとして$_POSTから取得した値をそのままqueryに投げ込むのは非常に危険ですので対策をされた方が良いと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる