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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

7回答

3178閲覧

PHPでチェックボックスを複数チェックした場合のDBへの登録方法

cometruejp

総合スコア13

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2016/04/13 10:29

こんにちは。

PHPで、以下の通りチェックボックスの内容をDBに登録したいのですが、登録に失敗します。

MariaDB [fruit]> select * from fruit_tbl;
+----+--------+---------------+
| id | name | fruit1 |
+----+--------+---------------+
| 1 | test1 | apple, orange |
| 2 | test2 | |
+----+--------+---------------+

以下の箇所がおかしいことがわかるのですが、どう直せばよいのかわかりませんでした。


$fruit1 = $_REQUEST['fruit1'];
for($i=0; $i<sizeof($fruit1); $i++){
print "${fruit1[$i]}<br>";
}

//フォームで送られてきたデータでINSERT文を作成
$result = mysqli_query($con, "insert into fruit_tbl(name, fruit1) values('$name', '$fruit1[$i]')");
if (!$result) {
exit('データを登録できませんでした。');
}

ご教示いただけませんか。

宜しくお願い致します。

【mariaDBの作業】

mysql -u root -p

Enter password: ********

MariaDB [(none)]> create database fruit;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| fruit |
+--------------------+

MariaDB [(none)]> use fruit;
Database changed
MariaDB [fruit]> create table fruit_tbl(
-> id int not null auto_increment,
-> name varchar(20),
-> fruit1 varchar(20),
-> primary key(id)
-> );
Query OK, 0 rows affected (0.23 sec)

MariaDB [fruit]> show tables;
+-----------------+
| Tables_in_fruit |
+-----------------+
| fruit_tbl |
+-----------------+
1 row in set (0.00 sec)

MariaDB [fruit]> insert into fruit_tbl(name, fruit1) values('test', '');
Query OK, 1 row affected (0.14 sec)

MariaDB [fruit]> select * from fruit_tbl;
+----+--------+---------------+
| id | name | fruit1 |
+----+--------+---------------+
| 1 | test | apple, orange |
| 2 | test | |
+----+--------+---------------+

MariaDB [fruit]>

【fruit.html】

<html> <body> <form action = "fruit.php" method="post"> 名前:<input type="text" name="name"><br /> くだもの: <input type="hidden" name="fruit1" value="Unchecked"> <input type="checkbox" name="fruit1[]" value="apple"> apple <input type="checkbox" name="fruit1[]" value="orange"> orange <input type="submit" name="exec" value="登録"> <input type="reset" value="リセット"> </form> </body> </html>

【fruit.php】

<?php //データベースに接続 $con = mysqli_connect('127.0.0.1', 'root', 'password'); if (!$con) { exit('データベースに接続できませんでした。'); } //データベースを選択 $result = mysqli_select_db($con, 'fruit'); if (!$result) { exit('データベースを選択できませんでした。'); } $name = $_REQUEST['name']; print "$name<br>"; $fruit1 = $_REQUEST['fruit1']; for($i=0; $i<sizeof($fruit1); $i++){ print "${fruit1[$i]}<br>"; } //フォームで送られてきたデータでINSERT文を作成 $result = mysqli_query($con, "insert into fruit_tbl(`name`, `fruit1`) values('$name', '$fruit1[$i]')"); if (!$result) { exit('データを登録できませんでした。'); } //データベースから切断 $con = mysqli_close($con); if (!$con) { exit('データベースとの接続を閉じられませんでした。'); } ?>

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

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

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

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

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

T.Yokotani

2016/04/13 10:34 編集

エラーメッセージはどのようなものが出ているのでしょうか? またunique_keyの情報などもいただけると色々わかると思います。
cometruejp

2016/04/13 10:52

エラーメッセージは、以下の通りです。 Notice: Undefined index: fruit1 in fruit.php on line 16 DBは、【mariaDBの作業】 のログ以外のことは行っておりません。 宜しくお願い致します。
T.Yokotani

2016/04/13 11:22

$fruit1 = $_REQUEST['fruit1']; の直後で ver_dump($fruit1); を表示してみて、その結果を見せていただけますか? また、MySQLにて desc fruit_tbl; の結果を教えていただけますでしょうか?
cometruejp

2016/04/13 12:21

ver_dump($fruit1);の表示結果は以下の通りです。 Fatal error: Call to undefined function ver_dump() in fruit.php on line 17 MariaDB [fruit]> desc fruit_tbl; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | fruit1 | varchar(20) | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+ PHP Version 5.6.19です。 宜しくお願い致します。
guest

回答7

0

print "${fruit1[$i]}<br>";

print "{$fruit1[$i]}<br>";
ではないでしょうか?

投稿2016/04/13 12:28

megumiro

総合スコア18

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

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

cometruejp

2016/04/13 18:52

コメントありがとうございます。いろいろ調べて、implodeを使用することにしました。 $fruit1 = implode(", ", $_POST["fruit1"]); ありがとうございました。
guest

0

コメントありがとうございます。いろいろ調べて、implodeを使用することにしました。
$fruit1 = implode(", ", $_POST["fruit1"]);
ありがとうございました。

投稿2016/04/13 19:01

cometruejp

総合スコア13

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

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

0

コメントありがとうございます。いろいろ調べて、implodeを使用することにしました。
$fruit1 = implode(", ", $_POST["fruit1"]);
ありがとうございました。

投稿2016/04/13 18:59

cometruejp

総合スコア13

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

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

0

自己解決

PHPファイルにimplodeを使用しました。
$fruit1 = implode(", ", $_POST["fruit1"]);

投稿2016/04/13 18:57

cometruejp

総合スコア13

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

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

0

hiddenのは初期値なしにする。
submitかける際にJavaScriptでチェックボックスを確認し、
指定があればその内容を、なかったら'Unchecked'を設定する。
(hiddenのへ設定をするという意味です)
PHP内では上記を前提としてSQL文を作成して
INSERTを実行する。

投稿2016/04/13 13:32

takasima20

総合スコア7458

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

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

cometruejp

2016/04/13 18:56

コメントありがとうございます。いろいろ調べたのですが、PHP側でimplodeを使用することにしました。 $fruit1 = implode(", ", $_POST["fruit1"]); ありがとうございました。
guest

0

php

1$a=[1,2,3]; 2for($i=0;$i<sizeof($a);$i++); 3echo $i; //3

このようになって、echo $a[$i]; はエラーになります。
※その場合のエラーは「PHP Notice: Undefined offset: 3 in /workspace/Main.php on line 6」なので違うのかも知れませんが...

というわけで、

php

1$result = mysqli_query($con, "insert into fruit_tbl(name, fruit1) values('$name', '$fruit1[$i]')");

このコードの「$fruit1[$i]」が配列の外を指定してるのかな?と思いますがいかがでしょうか?

投稿2016/04/13 12:06

hirohiro

総合スコア2068

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

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

cometruejp

2016/04/13 18:51

コメントありがとうございます。いろいろ調べて、implodeを使用することにしました。 $fruit1 = implode(", ", $_POST["fruit1"]); ありがとうございました。
guest

0

hiddenでこのinputを設けられている意味がよく解からないんですけど

html

1<input type="hidden" name="fruit1" value="Unchecked">

これはチェックボックスではないので 無条件で配列ではない 「fruit1」と言う名前のデータが送られるわけですよね
そこに配列を持つチェックボックスのデータを合わせて送っている所が エラーの原因念ではないでしょうか?

投稿2016/04/13 12:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

cometruejp

2016/04/13 18:49

おっしゃるとおりだと思います。上記の行を削除しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問