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

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

ただいまの
回答率

90.50%

  • PHP

    20775questions

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

  • MariaDB

    304questions

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

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

解決済

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 1,048

cometruejp

score 5

こんにちは。

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(namefruit1) 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(namefruit1) values('$name', '$fruit1[$i]')");
if (!$result) {
  exit('データを登録できませんでした。');
}

//データベースから切断
$con = mysqli_close($con);
if (!$con) {
  exit('データベースとの接続を閉じられませんでした。');
}

?>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • T.Yokotani

    2016/04/13 19:33 編集

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

    キャンセル

  • cometruejp

    2016/04/13 19:52

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

    キャンセル

  • T.Yokotani

    2016/04/13 20:22

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

    キャンセル

  • cometruejp

    2016/04/13 21: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です。 宜しくお願い致します。

    キャンセル

回答 7

+1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/14 03:52

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

    キャンセル

check解決した方法

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/14 03:49

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

    キャンセル

0

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


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

というわけで、

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/14 03:51

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/14 03:56

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    20775questions

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

  • MariaDB

    304questions

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