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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

1182閲覧

PHP 中間テーブルに追加したい

ke_i

総合スコア8

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/04/05 15:10

前提・実現したいこと

簡易的なブログサイトを作成しています。

行いたいことは、1つ記事を投稿するとき複数のタグを選択して投稿できるようにしたいです。 
投稿後は記事に選択したタグが表示されるような状態にしたいです。

テーブル

記事テーブル、中間テーブル、タグテーブルの3つを作成しました。

記事テーブルのidが中間テーブルと紐づいており、
その中間テーブルのidに選択されたタグidが入るイメージです。

わからないこと

肝心のSQL文と、値の挿入方法の流れがわかりません。

困っていることは、記事を1つ追加する時タグidを複数選びまとめて記事テーブルに格納しますが、
その時に、中間テーブルには記事idは追加されていないため、タグテーブルと記事テーブルが紐づかず、中間テーブル先にあるタグidが取得できないのです。

行ったこと

記事idを作成しないと何もできないとわかったので、以下の方法で進めてみました。
しかし3つめでエラーが出てしまい、つまづいている状態です。どなたか知恵を貸していただきたいです。
そもそもこれで合っているのかよくわからないのですが...

  1. タグidのnullをOKとし記事追加
  2. nullの記事idを取得
  3. 中間テーブルに記事idと選択されたタグidを格納
  4. 記事テーブルのタグidを中間テーブルのidにUPDATE

コード(3つ目のSQL文)

$sql = 'INSERT INTO tag_article (article_id, tag_id) VALUES (:article_id, :tag_id)'; $sth = $pdo -> prepare($sql); $sth -> bindValue(':article_id', $article_idddd,PDO::PARAM_INT); $sth -> bindValue(':tag_id', $_SESSION['tag_id'],PDO::PARAM_INT); $sth -> execute(); $article_tag = $sth -> fetch();

エラー文言

SQLSTATE[HY000]: General error

環境

PHP,mySQL

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

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

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

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

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

kyoya0819

2020/04/05 17:12

一度、 $article_idddd $_SESSION['tag_id'] の二つの変数が期待通りの値を持っているか確認されてみてはいかがでしょうか? 当方で確認しようにも、コードの範囲が狭すぎて試すことができません。
ke_i

2020/04/06 02:23

ご回答ありがとうございます! 確認してみると、$_SESSION['tag_id']に値が配列で入っていたのでうまく動いていなかったようです。 foreachで取り出した後、変数で格納すると無事入ったのですが、なぜかnullで設定しているtag_idに必ず1が入ってしまい記事id1にタグid1がついてしまいなんだかよく分からない状態になってしまいました..><
guest

回答2

0

1.タグidのnullをOKとし記事追加
3.中間テーブルに記事idと選択されたタグidを格納

タグidがNullのままでないなら、3.の前に1.のデータタグidを更新する必要がありますね。
というか、中間テーブルのキーなんだから、1.時点でタグidの発番が必要だと思います。

投稿2020/04/06 01:21

編集2020/04/06 01:21
sazi

総合スコア25195

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

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

ke_i

2020/04/06 02:17

ご回答ありがとうございます! 中間テーブルを使っての作成が初めてなのでいろいろと分からず恐縮なのですが、なにかしらタグidを発番した後正しい値にデータを更新するのでしょうか?それともそのまま複数選択されたタグidを追加するだけでタグidが発番されるものなのですか?
sazi

2020/04/06 02:36 編集

中間テーブルは複数のテーブルのキーの組み合わせですから、元になっているテーブルではキーが確定している必要があります。 元になるテーブルにinsertした場合には追加で生じたidを取得する必要があります。 https://www.php.net/manual/ja/pdo.lastinsertid.php
ke_i

2020/04/06 03:33

ご回答ありがとうございます! 同時に追加するのではなく元のテーブルでidを発行した後、そのidで中間テーブルのデータを追加できるようになるのですね! そして直近に追加したidはnullの有無で決めるのではなく、lastInsertIdを使用して取得できるのですね。 今回はとても勉強になりました。 下の方にもご連絡したのですが、本件解決しました!ご教示ありがとうございます!
guest

0

ベストアンサー

そもそもですが、記事テーブルはトランザクションテーブルで、タグテーブルはマスタですよね?

タグを選択してっていってますが、そのタグはタグテーブルから取得してリスト表示すれば良いのではないでしょうか?

1:N構造なのでチョイスしたタグが10個あれば中間テーブルには10レコード入るはずですよ。

投稿2020/04/05 21:07

編集2020/04/05 21:10
mackintosh

総合スコア228

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

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

ke_i

2020/04/06 02:08

ご回答ありがとうございます! おっしゃる通りタグテーブルをリスト表示していて、そこで選択された値を$_SESSION['tag_id']に格納してます。 しかしそうすると、別のエラーが発生してしまい全く進めることができず、1〜4の記載した流れで進めようとしておりました…! エラー文言:SQLSTATE[23000]: Integrity constraint violation:1452 Cannot add or update a child row: a foreign key constraint fails
mackintosh

2020/04/06 02:26 編集

中間テーブルに外部制約指定してるからですよね。 $_GET['article'] 実際どういう名称かわかりませんが、まず記事をinsertしますよね。 insertしたんだからid確保できますよね。 https://gray-code.com/php/getting-id-of-last-inserted-data-by-pdo/ $_GET['tag_ids'] 実際どういう名称かわかりませんが、こいつの個数分繰り返して、insert処理をすればいいんじゃないでしょうか? それでも解決しないなら情報が不足しています。 >3つめでエラーが出てしまい ・1つめと2つめはなんだろう... ・View側のコードがない...
ke_i

2020/04/06 03:25

とてもわかりやすい説明をありがとうございます! タグidをnullのままinsertして、insertlastInsertId()でidを取得し、中間テーブルで個数分insert処理を繰り返して、最後にタグidの更新をかけたところ無事成功しました! そして情報をあまり記載できておらずすみませんでした… 次回から質問時は関係するコードを全て書くようにします。今回はありがとうございました!
mackintosh

2020/04/06 03:37

多分その処理順だと他人が見たとき、なぜわざわざ更新してるんだろうと疑問に思うはずです。 複数のタグidはフロント側からリクエストされてきてるんですよね。なのでわざとtag_idsと書きました。 だとすれば中間テーブルで未確定なのはarticle_idですよね。 先に記事をinrertしてから、次に中間テーブルにinrertすれば、わざわざ更新処理なんてしなくても良いのではないでしょうか。 この流れならだいたいの人が見ても違和感はないと思いますよ。
ke_i

2020/04/06 04:00 編集

>先に記事をinrertしてから、次に中間テーブルにinrertすれば、わざわざ更新処理なんてしなくても良いのではないでしょうか。 この部分で質問があるのですが、最初に記事をinsertする時記事のid情報をゲットするために外部キーであるtag_idsはnull状態でinsertしたのですが、その必要は無いということになるのでしょうか?
mackintosh

2020/04/06 04:16

そうです。 insertしたんだからid確保できますよね。 ってところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問