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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

6330閲覧

チェックボックス(複数選択可)のDB登録

takeke

総合スコア60

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/16 08:19

編集2018/09/16 19:02

現在独学でやっていまして、わからないことがでてきたので質問させていただきます。

やりたいことはフォームを入力して送信したらmysqlに登録されているというものです。

後々にはそこから入力したデータを表示とかしたいのですが、まだその域にたどり着けないので、とりあえずは登録をちゃんとできるようにしたいと思っています。

色々参考にしながら試みているのですが、チェックボックスでつまづいています。
チェックボックスの箇所をコメントアウトしてみるとエラーがでなくてチェックボックス以外は登録できていました。

現在チェックボックス導入後、エラー表示はでないのですが、登録ができなくなっています。

以下記述内容です

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>フォーム登録</title> 6 <link rel="stylesheet" type="text/css" href="css/test09_04.2.css"> 7</head> 8<body> 9 <legend class="form"><h1>フォーム登録</h1> 10 <form name="form1" class="page1" id="page1" action="php/task_ex1.php" method="post"> 11 <div> 12 <label for="textForm">名前:</label> 13 <input type="text" placeholder="名前入力してください" size="50" maxlength="50" name="name_form" id="textForm"> 14 </div> 15 <div> 16 <label for="radioForm" class="gender">性別:</label> 17 <label for="gender1">男性</label><input type="radio" name="gender" value="男性" id="gender1"> 18 <label for="gender2">女性</label><input type="radio" name="gender" value="女性" id="gender2"> 19 <label for="gender3">その他</label><input type="radio" name="gender" value="その他" id="gender3" checked="checked"> 20 </div> 21 <div class="age"> 22 年齢:<select name="age" id="selbox"> 23 <option value="~20代">~20代</option> 24 <option value="30代~40代">30代~40代</option> 25 <option value="50代~60代">50代~60代</option> 26 <option value="70代~">70代~</option> 27 </select> 28 </div> 29 <div class="questionnaire"> 30 アンケート:好きな色(複数選択可) 31 <input type="checkbox" name="q1[]" value="" id="color1" ><label for="color1"></label> 32 <input type="checkbox" name="q1[]" value="" id="color2" ><label for="color2"></label> 33 <input type="checkbox" name="q1[]" value="" id="color3" ><label for="color3"></label> 34 <input type="checkbox" name="q1[]" value="" id="color4" ><label for="color4"></label> 35 <input type="checkbox" name="q1[]" value="" id="color5" ><label for="color5"></label> 36 </div> 37 <div class="free_space"> 38 自由記入欄:<br> 39 <textarea id="freeSpace" name="free_space" cols="50" rows="6" placeholder="ご自由にご記入して下さい" ></textarea> 40 </div> 41 <div> 42 <input type="submit" id="button" value="取得する" > 43 <input type="reset" value="クリア"> 44 </div> 45 </form> 46 </legend> 47</body> 48</html>

php

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<title>フォーム登録2</title> 5</head> 6<body> 7<?php 8 9$con = mysqli_connect('localhost','root',''); 10if (!$con) { 11 exit('データベースに接続できませんでした。'); 12} 13 14$result = mysqli_select_db($con,'task_ex1_db'); 15if (!$result) { 16 exit('データベースを選択できませんでした。'); 17} 18 19$result = mysqli_query($con,'SET NAMES utf8'); 20if (!$result) { 21 exit('文字コードを指定できませんでした。'); 22} 23 24$name_form = addslashes($_REQUEST['name_form']); 25$gender = addslashes($_REQUEST['gender']); 26$age = addslashes($_REQUEST['age']); 27//$q1 = addslashes($_REQUEST['q1']); 28$q1; 29if (!empty($_POST['q1'])){ 30 $q1 = implode(',', $_POST['q1']); 31}else{ 32 $q1 = 'チェックなし'; 33} 34$free_space = addslashes($_REQUEST['free_space']); 35 36$result = mysqli_query($con,"INSERT INTO personaldata(name_form, gender, age, q1, free_space) VALUES('$name_form', '$gender', '$age', '$q1', '$free_space')"); 37if (!$result) { 38 exit('データを登録できませんでした。'); 39} 40 41$con = mysqli_close($con); 42if (!$con) { 43 exit('データベースとの接続を閉じられませんでした。'); 44} 45 46?> 47<p>登録が完了しました。<br /><a href="../task_ex1.html">戻る</a></p> 48</body> 49</html>

イメージ説明

イメージ説明

オプションで全文チェックした結果
イメージ説明

似たような質問もあったので参考にはしたんですが、それでも解決まで至れなかったのでアドバイスなどいただけると助かります!

よろしくお願いいたしますm(_ _)m

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

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

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

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

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

m.ts10806

2018/09/16 08:55

このエラー出たときはチェックボックスから何も送信していないとかですか? ただ送ったとしてもname[]で送ると配列なのでaddslashes()の時点でエラー出ると思いますが。
m.ts10806

2018/09/16 08:57

ただ、addslashes()のPHPマニュアルにもある通り( http://php.net/manual/ja/function.addslashes.php ) DB挿入時にエスケープするのであればそれぞれのDBエンジンで用意されたエスケープ用の関数を使われたほうが良いです。
takeke

2018/09/16 09:24

ありがとうございます!そうですね、チェックしてない状態で送信した時のエラーです。今修正してチェック有りなしの両方のエラー加えました。
m.ts10806

2018/09/16 09:37

チェックなしではnullで送信されます。ひとまず addslashes()をやめた上で配列でくるデータに関してはisset()かarray_key_exist()で$_POSTへ存在チェックを行い、値をセットすると良いです。デフォルト値を空文字などで準備しておくと今のSQLから変更が少なくて済みます。※DBのカラム設定がnot nullであれば、送られてくる情報の必須チェックは必要ですね。
m.ts10806

2018/09/16 09:39

エラーメッセージで調べると原因と対策を書いてある記事は結構みつかると見つかると思います。ヒントになるかなとなるかなと
takeke

2018/09/16 09:58

$q1のところだけ$q1 = $_POST['q1'];に変えましたら、チェックなしは今までと同じエラーで、チェック有りの時はifの「データが登録できません」でエラー文なしにかわりました。
m.ts10806

2018/09/16 15:28

対応内容があまり私のアドバイスが活かされてないような
takeke

2018/09/16 15:40

上記プラスisset()でやろうと何時間か試行錯誤してたんですがうまくいかないまま力尽きてましたw
takeke

2018/09/16 17:34 編集

すみません、やっぱり$_POSTに’q1’が入っているかのチェックをisset()かarray_key_exist()でするのがどうにもわかりませんでした><  if とimplode使ったらエラーがなくなったので質問文修正しております。しかし登録ができないので未だ悩み中です
退会済みユーザー

退会済みユーザー

2018/09/16 17:42

エラーメッセージを質問文に追記しましょう。
takeke

2018/09/16 18:00 編集

みていただいてありがとうございます。現在は質問文の通りで、エラーメッセージがでていない状態です>< 混乱させてすみません、削除リクエスト中なのでご容赦をm(_ _)m
guest

回答1

0

ベストアンサー

php

1<?php 2 3// エラーを表示 4ini_set('display_errors', 1); 5error_reporting(E_ALL); 6?> 7<html> 8<head> 9<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 10<title>フォーム登録2</title> 11</head> 12<body> 13<?php 14 15$con = mysqli_connect('localhost','root',''); 16if (!$con) { 17 exit('データベースに接続できませんでした。'); 18}

上記のようにして、エラーが表示されるようにしてください。

また、回答者はあなたの提示したコードを実行できません。
なぜなら、データベースの定義や、DBに保存されている値が提示されておらず、目視でコードを追うという非効率な方法でデバッグすることになります。

こちらの「質問するときのヒント」にあるように、回答者が問題を再現できるための情報を提示しましょう。


答えがわかっているから回答できる方法なのですが。

これを記述しよう。

php

1$result = mysqli_query($con,"INSERT INTO personaldata(name_form, gender, age, q1, free_space) VALUES('$name_form', '$gender', '$age', '$q1', '$free_space')"); 2if (!$result) { 3 printf("Errormessage: %s\n", mysqli_error($con)); // 追記ここにDBのエラーが表示されるはず。 4 exit('データを登録できませんでした。'); 5}

イメージ説明

投稿2018/09/16 18:05

編集2018/09/16 19:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takeke

2018/09/16 18:19

ありがとうございますm(_ _)m <?php // エラーを表示 ini_set('display_errors', 1); error_reporting(E_ALL); ?> を追加ってだけですよね?? やってみたのですがエラーは表示されませんでした。 チェックしても、しなくても、「データを登録できませんでした」となってしまいます>< 現状なにかわかることってありますでしょうか?? DBは載せ方しらべてみますm(_ _)m
退会済みユーザー

退会済みユーザー

2018/09/16 18:24 編集

それをどこに記述したのかは問題ですが、 エラーも出ないならコードを追うしかないです。
退会済みユーザー

退会済みユーザー

2018/09/16 18:27

SHOW CREATE TABLE personaldata; を実行して、CREATE文を提示してください。
takeke

2018/09/16 18:29

DBのスクショを載せました! おそらくなんですが、 $result = mysqli_query($con,"INSERT INTO personaldata(name_form, gender, age, q1, free_space) VALUES('$name_form', '$gender', '$age', '$q1', '$free_space')"); この1文の記述がおかしいのかと思っています。 ずっとこの記述でエラーがでており、「Notice: Array to string conversion~」の表示があったのですが、他のラインを修正していたところ上記のエラーの記述がでなくなっていました。が、何がおかしいのか自分では判断つきません><
退会済みユーザー

退会済みユーザー

2018/09/16 18:31 編集

> ずっとこの記述でエラーがでており エラー出ているんじゃん。なんで書かないの?あと、エラーは省略せずに記述しましょう。
退会済みユーザー

退会済みユーザー

2018/09/16 18:31

SHOW CREATE TABLE personaldata; を実行して、CREATE文を提示してください。
takeke

2018/09/16 18:36

ターミナルかパワーシェルでSHOW CREATE TABLE personaldata;ですよね? 自分phpMyadminから直接テーブル作ったので質問文のスクショでも大丈夫ですか?一応今シェルからの接続しらべてみます!
退会済みユーザー

退会済みユーザー

2018/09/16 18:39

phpMyAdmin のSQLから実行してください。 > 質問文のスクショでも大丈夫ですか? ダメだから依頼してます。
takeke

2018/09/16 18:40

いえ、現在の質問文の内容で記述したところ、エラー表示がでなくなったという感じです。説明が下手ですみません>< 以前の記述でのエラー文を追加したほうがいいでしょうか?
takeke

2018/09/16 18:41

わかりました!色々すみません>< phpMyAdmin のSQLから実行してみます!
退会済みユーザー

退会済みユーザー

2018/09/16 18:43

とりあえず、今は必要ないですが、エラーは重要な手がかりです。 「Aの場合には、「・・・・・」というエラーが表示され、Bをするとエラーは表示されませんでした。」というように、詳細に説明しないと、回答者はめんどくさいので回答を敬遠します。今後留意してください。
takeke

2018/09/16 18:49

かしこまりました>< CREATE文がどこまでなのかわからなかったので質問文に実行後のスクショ載せました。
退会済みユーザー

退会済みユーザー

2018/09/16 18:51

これが役に立つ情報かどうか、考えて!
退会済みユーザー

退会済みユーザー

2018/09/16 18:54

「オプション」ー>「全文」にチェックを入れて「実行」
takeke

2018/09/16 19:03

すみません><今全文結果スクショのせました!
退会済みユーザー

退会済みユーザー

2018/09/16 19:06

追記した回答を参考にしてください。 > 今全文結果スクショのせました! 今回はしかたないけど、こういうものはテキストで書きましょう。テキストであれば、回答者はコピペで自分の実行環境にDBをサクッと作れますが、スクショだと、文字を書き起こさなくてはなりません。回答者に余計な手間をかけさせることであなたは問題解決から遠ざかります。
takeke

2018/09/16 19:09

エラー文も回答にあるとおり書きましたところ以下のようにでてきました。 Notice: Undefined variable: mysqli in C:\xampp\htdocs\フォーム登録\php\task_ex1.php on line 54 Notice: Trying to get property 'error' of non-object in C:\xampp\htdocs\フォーム登録\php\task_ex1.php on line 54 Errormessage: データを登録できませんでした。 なお、ライン54というのは printf("Errormessage: %s\n", $mysqli->error);です
退会済みユーザー

退会済みユーザー

2018/09/16 19:10

コード間違えてました、修正しておきます。
takeke

2018/09/16 19:12

すみません!?そこまで考えが及びませんでした>< 以後気をつけますm(_ _)m
takeke

2018/09/16 19:14

ありがとうございます>< 修正後エラー文です Errormessage: Unknown column 'q1' in 'field list' データを登録できませんでした。 チェックありなし、どちらもこちらでした
退会済みユーザー

退会済みユーザー

2018/09/16 19:16

「Unknown column 'q1' in 'field list'」これがデータを登録できない原因ですよ。
takeke

2018/09/16 19:23

ありがとうございます! カラムというのはgenderとかageとかですよね?q1[]の[]が必要ということですか?
退会済みユーザー

退会済みユーザー

2018/09/16 19:27

そのまま訳せばいいんです。 フィールドリストに「q1」という未知のカラム というエラーです。
takeke

2018/09/16 19:35

すると、q1というカラムをphpmyadminで追加するということでしょうか?
退会済みユーザー

退会済みユーザー

2018/09/16 19:38 編集

あなたが定義したカラムは「q1[]」ですよ。q1じゃなくて。 q1[] と書かなければいけないのではありませんか?もしくは、q1[] と定義しているカラム名を q1 に変更するか。 結局あなたがどうするのかを決めること。
takeke

2018/09/16 19:48

そうなんですが、、、複数選択可のチェックボックスではカラムに[]つけないといけないんですよね?
退会済みユーザー

退会済みユーザー

2018/09/16 19:50 編集

HTMLにはつける必要があるけど、DBのカラム名には普通つけません。 DB名やカラム名に通常記号を使うことはありません。ハイフンやアンダースコアはよく使われますが、[]はこれまでみたことない。
takeke

2018/09/16 20:02

えええ!?HTMLだけに[]必要だったんですか!? 今DBをq1に変更しましたら無事にチェック有りも無しも登録できるようになりました>< 本当に申し訳ないのと、恥ずかしいのと色々な感情です今、、、 でもKosuke_Shibuyaさんいなかったら明日以降も延々と悩み続けていたと思います>< 本当にありがとうございましたm(_ _)m
退会済みユーザー

退会済みユーザー

2018/09/16 20:12

ネットの情報もいいですけど、何か1冊、サイトをひと揃い作成するような書籍を購入して学習してください。現在のコードはセキュリティ的な問題もあるし、もし自分が書くなら80%くらい書き直すと思います。 3000円程度で買えるものですし、その程度の自己投資はして欲しいです。プログラマの時給は3000円以上です。将来1時間で稼げる金額を今使っても元は取れるでしょう。
takeke

2018/09/16 20:19

そうですね>< 一応プロゲートで勉強してるんですが、ピンポイントで使える記述がない時とかはネットの情報ごちゃまぜでやるみたいな感じになってます。確かに、書籍でサイト1から作るようなのでも勉強したほうがよさそうですね><アドバイスありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問