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

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

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

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

データベース

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

Q&A

解決済

2回答

10951閲覧

別のテーブルから値を取得し、formで別のテーブルに送信する方法(PHP)

nyowaa

総合スコア13

PHP

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

データベース

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

0グッド

0クリップ

投稿2016/12/02 02:04

編集2016/12/07 02:31

初めての質問です、宜しくお願い致します。

###前提・実現したいこと
PHPのフォームの部分なのですが、フォームの内容をデータベースに書き込む際に、他のテーブルのidをフォームを送信するテーブルのidにデータを送りたいのですが、データ件数カウントの指定方法がダメなのか、変数の指定がダメなのかわからず困っております。
どなたか助言をお願い致します。

ちなみに、システム(アプリ)は、メニューの一覧があり、チェックを入れて送信すると、データベースに選んだメニューのデータが送られるという感じです。idはメニューの種類(主菜など)です

###該当のソースコード
テーブルの結合を行って、menuIdを持ってきているはず・・・なのですが、データベースの方には値が0としか入ってくれません・・・
コードはこんな感じです↓↓

PHP

1//データ件数をカウント、変数dataに代入 2$recordSet = mysqli_query('SELECT COUNT(id) FROM dish INNER JOIN menu ON dish.dishId = menu.menuId'); 3$data = mysqli_fetch_assoc($recordset); 4 5$id = $data['count(id)']+1; 6$dishId = $_POST[menuId]; 7$dishMenu1 = $_POST[dishMenu1]; 8$dishMenu2 = $_POST[dishMenu2]; 9$dishMenu3 = $_POST[dishMenu3]; 10$dishMenu4 = $_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());

###試したこと
$recordSetはテーブル結合しているはずなので、変に弄るともっと分からなくなるかなと思い、
$dishId=$_POST[menuId];の部分を$dishId=$_POST[dishId];にしてみたのですが、0の値のままでした。

###追記
テーブル構造↓
dishはdishId,dishMenu1,dishMenu2,dishMenu3・・・
menuはmenuId,menu1,menu2,menu3・・・という構造になっています。

考えてみたところ、この結合方法は不適切かな・・・?と思いましたので、上記にあるコードの

$recordSet = mysqli_query('SELECT COUNT(id) FROM dish INNER JOIN menu ON dish.dishId = menu.menuId');

の部分を

$recordSet = mysql_query('SELECT COUNT(id) as CNT FROM answers');

$sql = sprintf('SELECT * FROM questions WHERE questionnaires_id="%s"',mysql_real_escape_string($_GET['q']));

に書き換えてみましたが、idが取得されませんでした。


現在、このような感じです。

$recordSet = mysql_query('SELECT COUNT(id) as CNT FROM answers'); $sql = sprintf('SELECT * FROM questions WHERE questionnaires_id="%s"',mysql_real_escape_string($_GET['q'])); $data = mysql_fetch_assoc($recordSet); $id = $data['CNT']+1; $dishId = $_POST[menuId]; $dishMenu1 = $_POST[dishMenu1]; $dishMenu2 = $_POST[dishMenu2]; $dishMenu3 = $_POST[dishMenu3]; $dishMenu4 = $_POST[dishMenu4]; //書き込み部分 mysqli_query('INSERT INTO dish SET id="'.$id.'",dishId="'.$dishId.'",dishMenu1="'.$dishMenu1.'",dishMenu2="'.$dishMenu2.'",dishMenu3="'.$dishMenu3.'",dishMenu4="'.$dishMenu4.'"') or die(mysqli_error());

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

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

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

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

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

kunai

2016/12/02 02:41

dishとmenuのテーブル構造はどうなってますか?カウントしたいのはdishテーブル(もしくはmenuテーブル)のidであり、dishテーブルの「dishId」とmenuテーブルの「menuId」が同じもの、と言う条件で正しいですか?一般的な設計で考えると、結合条件は「dishテーブルのmenuId」と「menuテーブルのmenuId」のように思えますが。。また、「SELECT COUNT(id) FROM」ではなく「SELECT COUNT(id) as cnt FROM」にした方が、配列のキーに記号が含まれる気持ち悪さがなくなってよいかと思います。
ShoheiTai

2016/12/02 03:09

テーブル定義を教えていただきたいです。join周りが怪しそうですが、定義がわからないとなんとも言えない状態です。。
nyowaa

2016/12/05 06:39

コメントありがとうございます。テーブルの構造を追記させていただきました。また、SELECT COUNT (id) FROM の部分も修正させていただきました!
guest

回答2

0

ベストアンサー

COUNT(ID)に名前を付ける必要があると思います。
また$_POSTの参照方法が違いますね。
他にも問題はあるかもしれませんが、とりあえず目についたところです。
修正したのがこちらになります。

PHP

1$recordSet = mysqli_query('SELECT COUNT(id) as CNT FROM dish INNER JOIN menu ON dish.dishId = menu.menuId'); 2$data = mysqli_fetch_assoc($recordset); 3 4$id = $data['CNT']+1; 5$dishId = $_POST['menuId']; 6$dishMenu1 = $_POST['dishMenu1']; 7$dishMenu2 = $_POST['dishMenu2']; 8$dishMenu3 = $_POST['dishMenu3']; 9$dishMenu4 = $_POST['dishMenu4'];

投稿2016/12/02 05:02

ttyp03

総合スコア16998

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

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

nyowaa

2016/12/07 02:01

回答ありがとうございます。所々修正をして、追記にて投稿させていただきました。 また、同じく追記にあります通り、私が行いたいことと結合方法は不適切かなと思い、修正させていただきました。
ttyp03

2016/12/07 02:08

$id = $data['count(id)']+1; これが修正されていません。 それから$sqlは使われていないですが、それは認識されておりますか? 更に今更ですが、COUNT(id)はidそのものではなく、条件に一致した件数が取得されます。 こちらも意図しているでしょうか。 つまり現状のクエリではWHERE句はありませんから、answersテーブルのレコード数が返ります。
nyowaa

2016/12/07 02:51

コメントありがとうございます! $recordSet = mysql_query('SELECT COUNT(questionnaires_id) as CNT FROM answers GROUP BY questions'); $data = mysql_fetch_assoc($recordSet); $id = $data['CNT']+1; $dishId = $_POST['menuId']; $dishMenu1 = $_POST['dishMenu1']; $dishMenu2 = $_POST['dishMenu2']; $dishMenu3 = $_POST['dishMenu3']; $dishMenu4 = $_POST['dishMenu4']; このような感じで合ってますでしょうか・・・? 実行してみたところ、 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in xxxxxx on line 16 Duplicate entry '1' for key 'PRIMARY' というエラーが起こってしまいました。 ちなみに16行は$data = mysql_fetch_assoc($recordSet);の部分です。 宜しくお願い致します。
ttyp03

2016/12/07 03:59

まずはクエリの結果は想定している結果通りでしょうか? 先ほども書きましたが、COUNTは件数を返す関数です。 phpMyAdmin等でクエリのみ実行してみることをお勧めします。 エラーの原因については、恐らくmysql_fetch_assocではなく、最後のINSERTのクエリではないでしょうか。 INSERTしようとしている値が既に登録されている、というエラーになると思います。 問題を切り分けるために、とりあえずINSERTの処理はコメントアウトして実行してみてください。
nyowaa

2016/12/07 06:37

ありがとうございます。 $recordSetの部分を、('SELECT * FROM dish CROSS JOIN menu')に書き換えてみました。 そしてINSERT部分をコメントアウトして実行してみましたところ正常に動作したので、INSERT部分に問題があることがわかりました。そして、ここ(http://www.sql-reference.com/insert/insert_select.html)を参考にINSERT部分を少しいじってみました。 INSERT INTO dish (dishId) SELECT menuId FROM menu SET・・・ ↑こんな感じです。これを実行してみましたところ、先ほどのエラーは消えたのですが、 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET id="", menuId="", menu1="今から", menu2="", ' at line 1 というようなエラーが出てしまいました。 宜しくお願いいたします。
ttyp03

2016/12/07 06:42

MySQLにおける文字列は、ダブルクォーテーションではなく、シングルクォーテーションになります。 それでエラーになっていると思いますので、修正してみてください。
nyowaa

2016/12/08 00:09

ttyp03様、ありがとうございました!おかげで解決することができました!
guest

0

なんかPHPのコードでError/Warningがいっぱい出てるような気がするのですが。。。
以下のようにPHPのソースファイルの先頭を以下のようにしてError/Warningが表示されるようにしてみてください。

記載されたコードに絞ってみれば、
表示されたエラーを修正すると動作する気がします。

投稿2016/12/02 05:40

Y.H.

総合スコア7914

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問