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

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

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

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

Q&A

4回答

4414閲覧

動的に出力されたinputの値を取得し、データベースに挿入する

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2015/10/29 07:51

HTML

1<input type="number" class="hoge" name="hoge_1" id="hoge_1">番 2<input type="number" class="hoge" name="hoge_1_r" id="hoge_1_r">周 3<input type="number" class="hoge" name="hoge_2" id="hoge_2">番 4<input type="number" class="hoge" name="hoge_2_r" id="hoge_2_r">周

これらの値を受け取り、データベースに挿入したいです。

PHP

1$hoge_1 = $_POST['hoge_1']; 2$hoge_1_r = $_POST['hoge_1_r']; 3$hoge_2 = $_POST['hoge_2']; 4$hoge_2_r = $_POST['hoge_2_r']; 5 6$sql = "insert into hoges (hoge_1,hoge_1_r,hoge_2,hoge_2_r) values (:hoge_1,:hoge_1_r,:hoge_2,:hoge_2_r)"; 7$stmt = $pdo->prepare($sql); 8$params = array(":hoge_1" => $hoge_1, ":hoge_1_r" => $hoge_1_r, ":hoge_2" => $hoge_2, ":hoge_2_r" => $hoge_2_r); 9$stmt->execute($params);

普通にPOSTで受け取ってINSERTすればいいのですが、
これらのHTMLはユーザー側が追加できるようになっています。

現在hoge_2_rまでありますが、プラスボタンを押すと

HTML

1<input type="number" class="hoge" name="hoge_1" id="hoge_1">番 2<input type="number" class="hoge" name="hoge_1_r" id="hoge_1_r">周 3<input type="number" class="hoge" name="hoge_2" id="hoge_2">番 4<input type="number" class="hoge" name="hoge_2_r" id="hoge_2_r">周 5<input type="number" class="hoge" name="hoge_3" id="hoge_3">番 6<input type="number" class="hoge" name="hoge_3_r" id="hoge_3_r">周

このようなHTMLになるので、PHPの受け取り側、データベースの挿入も
動的な形でなければいけないと思っていますが、どのような処理にすべきか苦戦しております。

ご教授いただきたいです!

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

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

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

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

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

guest

回答4

0

データ最大数が8個で固定されているのであれば、常に1-8全てを受信されたと仮定したプログラムにてINSERTされてはいかがでしょうか?
$_POSTではリクエストされなかったパラメータ名はNULL値になりますので、データベースのカラムがNULL許可されているのであれば適切にデータ登録されるかと思います。
クエリの動的生成よりは安全ですし。

投稿2015/10/29 09:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KiyoshiMotoki

2015/10/29 09:36 編集

私も同感です。 > データベースのカラムがNULL許可されているのであれば適切にデータ登録されるかと思います。 もし、パラメータが送られなかった場合に(NULL以外の)デフォルト値をインサートしたいのであれば、 パラメータの存在チェックをした上でパラメータの値か、デフォルト値かを選択してやれば良いと思います。
guest

0

SQL文を起こす例を記載いたします。
※上限8個まで
※$_POSTからパラメータを取得した際の各種チェック処理は省略しています。

ラベル名を配列化し、ループさせる方が汎用性があるかと思いますが、簡易的なものであれば、以下のようなループカウンタをラベル名に利用する方法もありかと存じます。

php

1<?php 2 3$hoge = array(); 4 5for($no=1 ; $no <= 8 ; $no++) 6{ 7 $id = "hoge_${no}"; 8 $id_r = "hoge_${no}_r"; 9 10 if ((isset($_POST[$id]) == true) && (isset($_POST[$id_r]) == true)) 11 { 12 $hoge[] = array("id"=>$id, "value"=>$_POST[$id], "id_r"=>$id_r, "value_r"=>$_POST[$id_r]); 13 } 14} 15 16$sql_id = null; 17$sql_value = null; 18 19$params = array(); 20 21foreach($hoge as $hoge_rec) 22{ 23 $id = $hoge_rec["id"]; 24 $value = $hoge_rec["value"]; 25 $id_r = $hoge_rec["id_r"]; 26 $value_r = $hoge_rec["value_r"]; 27 28 if ($sql_id == null) // 初回 29 { 30 $sql_id = "${id}, ${id_r}"; 31 $sql_value = ":${id}, :${id_r}"; 32 } 33 else 34 { 35 $sql_id .= ", ${id}, ${id_r}"; 36 $sql_value .= ", :${id}, :${id_r}"; 37 } 38 39 $params[":${id}"] = $value; 40 $params[":${id_r}"] = $value_r; 41} 42 43$sql = "insert into hoges (${sql_id}) values (${sql_value})"; 44

投稿2015/10/30 04:14

KenjiObata

総合スコア440

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

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

0

こんにちわ。

回答ではないのですが、気になった点がありまして、質問します。

  1. hogesテーブルのレイアウトは、どんな感じですか?
  2. HTML側で入力項目数を増やせるとのことですが、その数に制限はありますか?

以上、よろしくお願いします。

投稿2015/10/29 08:07

srsnsts

総合スコア480

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

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

trick

2015/10/29 08:09

私もそこは気になりました。 この方法では有限個になります。 無限に増やしたいのであれば、テーブル構造が変わってきます。
退会済みユーザー

退会済みユーザー

2015/10/29 08:16

1. hoge_1 hoge_1_r hoge_2 hoge_2_r ...hoge_8_rとフィールドを作っています。 2. 現在最大8個までです。 宜しく御願い致します。
srsnsts

2015/10/29 09:03

インターフェースのhtmlですが、要素のidに[]を付け配列化しました。 <html> <head> <meta charset="UTF-8" /> <script> var num = 1; function add(){ var box_html = document.getElementById('my_box').innerHTML; num++; box_html += num.toString(); box_html += '人目<br />'; box_html += '<input type="number" class="hoge" id="hoge[]">番<br />'; box_html += '<input type="number" class="hoge" id="hoge_r[]">周<br />'; document.getElementById('my_box').innerHTML = box_html; } </script> </head> <body> <div id="my_box">1人目<br /><input type="number" class="hoge" id="hoge[]">番<br /><input type="number" class="hoge" id="hoge_r[]">周<br /></div> <p><button onclick="add();">add</button></p> </body> </html> 値を受け取ってinsert処理するphpです。 パラメータも配列として受け取り、SQL文を動的に組み立てています。 $arr_hoge = $_POST['hoge']; $arr_hoge_r = $_POST['hoge_r']; $keys = ''; $parameter_names = ''; for($i=0;$i<count($arr_hoge);$i++){ $keys .= "hoge_$i,hoge_$i_r"; $parameter_names .= ":hoge_$i,:hoge_$i_r"; if($i<count($arr_hoge)-1){ $keys .= ","; $parameter_names .= ","; } } $sql = "insert into hoges ($keys) values ($parameter_names)"; $stmt = $pdo->prepare($sql); $params = array(); for($i=0;$i<count($arr_hoge);$i++){ array_push( $params, ":hoge_$i" => $arr_hoge[$i] ); array_push( $params, ":hoge_$i_r" => $arr_hoge_r[$i] ); } $stmt->execute($params); こんな感じでどうでしょう? ただ、実行していないのでいったんそちらの環境で動かしてみてくださいね。
退会済みユーザー

退会済みユーザー

2015/10/29 09:30

id ではなくて、name要素ではありませんか?
srsnsts

2015/10/29 10:19

Kosuke_Shibuya さんへ そうですね、idで配列は文法違反ですね。 すみませんでした、下に訂正したHTMLを載せます。 <html> <head> <meta charset="UTF-8" /> <script> var num = 1; function add(){ var box_html = document.getElementById('my_box').innerHTML; num++; box_html += num.toString(); box_html += '人目<br />'; box_html += '<input type="number" class="hoge" id="hoge[]">番<br />'; box_html += '<input type="number" class="hoge" id="hoge_r[]">周<br />'; document.getElementById('my_box').innerHTML = box_html; } </script> </head> <body> <div id="my_box">1人目<br /><input type="number" class="hoge" name="hoge[]">番<br /><input type="number" class="hoge" name="hoge_r[]">周<br /></div> <p><button onclick="add();">add</button></p> </body> </html>
guest

0

すいませんPHP使ったことないですが、

受け取り側も動的にすればよいと思います。

$hoge_1 = $_POST['hoge_1'];
$hoge_1_r = $_POST['hoge_1_r'];

ここの'hoge_1','hoge_1_r' の「1」を変数に変えて値が取れなくなるまでループ
取得した値は、配列に入れる。

次にSQLですが、これも動的に作成する
$sql = "insert into hoges (hoge_1,hoge_1_r,hoge_2,hoge_2_r) values (:hoge_1,:hoge_1_r,:hoge_2,:hoge_2_r)";

$sql = "insert into hoges
上記以降をループでデータがあるインデックスまで回して作成
values をプラスして、またループ

こんな感じでどうでしょうか

投稿2015/10/29 08:07

trick

総合スコア366

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

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

退会済みユーザー

退会済みユーザー

2015/10/29 08:18

ありがとうございます。 やっぱりそうですよね! そのやり方で実装中ですが記述に苦戦しております。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問