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

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

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

5985閲覧

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

nyowaa

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/12/06 05:45

編集2016/12/12 06:32

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

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

php

1//データ件数をカウント、変数dataに代入 2$recordSet = mysqli_query('SELECT COUNT(id) FROM dish); 3$data = mysqli_fetch_assoc($recordset); 4 5$id = $data['count(id)']+1; 6$dishId = $_POST['menuId']; 7$dishMenu1 = implode('',$_POST['dishMenu1']); 8$dishMenu2 = implode('',$_POST['dishMenu2']); 9$dishMenu3 = implode('',$_POST['dishMenu3']); 10$dishMenu4 = implode('',$_POST['dishMenu4']); 11 12//書き込み部分 13mysqli_query('INSERT INTO dish SET id="'.$id.'",dishId="'.$dishId.'",dishMenu1="'.$dishMenu1.'",dishMenu2="'.$dishMenu2.'",dishMenu3="'.$dishMenu3.'",dishMenu4="'.$dishMenu4.'"') or die(mysqli_error());

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

php

1 for($j=1; $j<=10; $j++){ 2 if($col['format']==$frmtR){ 3 //radio 4 if($col['dish'.$j]){ 5 if($col['required'.$k]){ 6 echo"<input required type='radio' name='menu{$menu_count}' id='menu{$menu_count}'value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>'; 7 }else{ 8 echo"<input type='radio' name='menu{$menu_count}' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>'; 9 } 10 } 11 }elseif($col['format']==$frmtC){ 12 //checkbox 13 if($col['dish'.$j]){ 14 if($col['required'.$k]){ 15 echo"<input reqired type='checkbox' name='menu{$menu_count}[]' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>'; 16 }else{ 17 echo"<input type='checkbox' name='menu{$menu_count}[]' id='menu{$menu_count}' value='".$col['dish'.$j]."'>".$col['dish'.$j].'<br>'; 18 } 19 } 20}

このように、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>

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobinobi

2016/12/06 06:15

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

2016/12/06 07:04

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

2016/12/06 07:05

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

2016/12/06 08:58

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

回答2

0

ベストアンサー

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

PHP

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

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

PHP

1<?PHP 2$id="hoge"; 3$dishId = filter_input(INPUT_POST,'dishId',FILTER_DEFAULT,["options"=>["default"=>""]]); 4$dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]])); 5$dishMenu2 = implode('、',filter_input(INPUT_POST,'dishMenu2',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]])); 6$dishMenu3 = implode('、',filter_input(INPUT_POST,'dishMenu3',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]])); 7$dishMenu4 = implode('、',filter_input(INPUT_POST,'dishMenu4',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]])); 8print 'INSERT INTO dish SET id="'.$id.'",dishId="'.$dishId.'",dishMenu1="'.$dishMenu1.'",dishMenu2="'.$dishMenu2.'",dishMenu3="'.$dishMenu3.'",dishMenu4="'.$dishMenu4.'"'; 9?> 10<hr> 11<form method="post"> 12dishMenu1<br> 13<input type="checkbox" name="dishMenu1[]" value="1">1 14<input type="checkbox" name="dishMenu1[]" value="2">2 15<input type="checkbox" name="dishMenu1[]" value="3">3<br> 16dishMenu2<br> 17<input type="checkbox" name="dishMenu2[]" value="x">x 18<input type="checkbox" name="dishMenu2[]" value="y">y 19<input type="checkbox" name="dishMenu2[]" value="z">z<br> 20<input type="submit" value="go"> 21</form>

修正

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

PHP

1<form method="post"> 2<div class="question" align="center"> 3<p align="left" style="display:inline-block;"> 4<input type='checkbox' name='dishMenu1[]' value='うああ'>うああ<br> 5<input type='checkbox' name='dishMenu1[]' value='うおおお'>うおおお<br> 6<input type='checkbox' name='dishMenu1[]' value='ふみゅ'>ふみゅ<br> 7<input type='checkbox' name='dishMenu1[]' value=''><br> 8<input type='checkbox' name='dishMenu1[]' value=''><br> 9sonota<input type='text' name='dishMenu2' value=''> 10<input type='hidden' name='question_id' value='1'></p></div> 11<div align="right"> 12<input type="submit" value="送信する" style="width:100px; height:30px;"> 13</div> 14</form> 15 16<?PHP 17$dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,array("flags"=> FILTER_REQUIRE_ARRAY,"options"=>array("default"=>array())))); 18$dishMenu2 = filter_input(INPUT_POST,'dishMenu2',FILTER_DEFAULT,array("options"=>array("default"=>""))); 19print $dishMenu1; 20print "<hr>"; 21print $dishMenu2; 22?>

追記

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

$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/08 02:54

編集2016/12/12 06:55
yambejp

総合スコア114896

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyowaa

2016/12/08 05:40

回答ありがとうございます!サンプルコードのほうもありがとうございます! 実行してみましたところ、 $dishId = filter_input(INPUT_POST,'dishId',FILTER_DEFAULT,["options"=>["default"=>""]]); の部分で[]部分がおかしいとのエラーが出力されてしまいました。。。 また、質問のコードにあります通り、ラジオボタン、チェックボックスともにデータベースの1つのidで別々の値を取得してきておりますので、 name="dishMenu1[]" value="1" のような表記は少々難しいです。。。 宜しくお願いいたします!
yambejp

2016/12/09 00:38

>[]部分がおかしい PHPのバージョンが古いのでしょうか? 具体的なエラーを提示してください >name="dishMenu1[]" value="1" もとのソースで「$_POST[dishMenu1]」をimplodeしようとしているので てっきり配列で渡しているのかと思いましたが違うのですね PHPで書いている送り元のmenu.php をHTML形式で質問に追記してください
nyowaa

2016/12/12 01:24

[]付近の構文エラーと表示されます。 追記しました!
yambejp

2016/12/12 01:35

話がかみあってないようですが・・・ 「menu.phpをブラウザで表示し、ソースをHTML形式で提示してください」 と書いたつもりですが、そうなっていないようです。 PHPのバージョンの問題であれば $dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,["flags"=> FILTER_REQUIRE_ARRAY,"options"=>["default"=>[]]])); ↓↓↓ $dishMenu1 = implode('、',filter_input(INPUT_POST,'dishMenu1',FILTER_DEFAULT,array("flags"=> FILTER_REQUIRE_ARRAY,"options"=>array("default"=>array())))); になります。 いずれにしろHTMLソース次第なので提示されない限り答えようがありません
nyowaa

2016/12/12 02:12

申し訳ありません、追記修正させていただきました!
yambejp

2016/12/12 03:16

修正版を追記しました。 エラーが出るようならPHPのバージョンも付記してください
yambejp

2016/12/12 03:17

今回はあくまでテストなのでsend.phpに送らず自分でうけるサンプルにしてあります
nyowaa

2016/12/12 06:30

追記有難うございます!バージョンは5.3.1でした。 はじめに質問させていただいた通り、ラジオボタンやチェックボックスはforやifを使い、formatというidに入っている値から判定して取得してきております。(radioという値が入っている場合はラジオボタンを取得、というようなものです) ですので、PHP部分の変数取得部分($dishMenu1...の部分です)は、 ラジオボタンの場合はimplodeで取得せず、チェックボタンの場合はimplodeで取得し、結果をデータベースに渡すというようなことを行いたいです。 (質問が下手で申し訳ありません。)
yambejp

2016/12/12 06:45

dishMenu1が送られてきたものをチェックするのであれば filter_inputにdefaultを指定せず、is_arrayでしらべた上で配列ならimplodeする そうでなければそのままの値を取るということでよいでしょう。 むしろ送られてくるものがラジオボタンなのかチェックボックスなのか その他なのかは重要ではありません。 配列で送られてくるものとしては、チェックボックスは顕著ですが セレクトボックスだってありえますし、通常のテキストボックスの可能性もあります
yambejp

2016/12/12 06:56

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

2016/12/13 05:16

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

0

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

ループしている値を"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/06 09:09

編集2016/12/06 09:21
nobinobi

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobinobi

2016/12/07 02:26

追記文確認致しました。 ではfomat部には問題ないという認識でいきます。 次は $dishMenu1 = implode('、',$_POST[dishMenu1]); $dishMenu2 = implode('、',$_POST[dishMenu2]); $dishMenu3 = implode('、',$_POST[dishMenu3]); $dishMenu4 = implode('、',$_POST[dishMenu4]); ですが、dishMenu1~dishMenu4はdefineで定義されているのでしょうか? ここのkeyを生成する部分はどのようになっているのでしょう。
nyowaa

2016/12/08 02:18

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

2016/12/08 02:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問