🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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回答

1257閲覧

データベースで、idを介した他のテーブルから値を取ってきたい。

rink

総合スコア80

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/12/07 09:57

php及びsql初心者です。 よろしくお願い致します。

今回僕が行いたいことは、題にも示したように、idを介した他のテーブルから値を取ってくることです。

僕が作ったデータベースは、
productというテーブル名で、product_id、product_price, product_authorなどの情報を持ったテーブルと、
cartというテーブル名で、product_id、product_num だけの情報を持ったテーブルです。

いったん、注文画面で

php

1try{ 2 $sql2 = "INSERT INTO cart (product_id, product_num) VALUES ($product_id, $num)"; 3 $stmt = $pdo->query($sql2); 4 } catch(PDOException $exception){ 5 echo '***'; 6 }

というように、cartテーブルの中に、注文する商品のidとnumを指定して、注文します。
これは、cartテーブルに情報がちゃんと載るので、大丈夫です。
ここからが僕の聞きたいところです。
次の画面に移って、注文した商品の確認と、最終注文変更が行えることになっているのですが、
本の注文された数を表示するために、前の画面で指定され、cartテーブルに格納された本のidとnumをcartテーブルからとってきて、そのidと同じidをもった本をproductテーブルからとり、そのタプルから商品名を表示させようとしています。(日本語がごたごたしていて申し訳ありません。)

そのときのsql文が

php

1try { 2 $pdo = new PDO($dsn, $user, $password, $options); 3 $sql = "SELECT * FROM `product`"; 4 $sql3 = "SELECT * FROM `cart` WHERE id = ";//① 5 $stmt = $pdo->query($sql); 6 $stmt3 = $pdo->query($sql3); 7 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 8 $result3 = $stmt3->fetchAll(PDO::FETCH_ASSOC); 9 } catch (PDOException $exception) { 10 echo $exception->getMessage(); 11 exit(); 12 }

途中でごめんなさい。
①で僕はcartテーブルに格納されているidと同じidを持った商品の情報をproductテーブルから取り出そうとしています。そこのWHERE文をどうやって書けばいいのかが分かりません。

どなたかよろしくお願い致します。

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

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

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

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

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

m.ts10806

2019/12/07 10:03

WHERE句の書き方の問題ではなく「そのIDをどうやって受け渡すか、受け取るか」の問題に見えるのですが、どうなんでしょうか。 いずれにしても現在のコードのままですとSQLインジェクションの脆弱性があるのでそこの指摘は必ず入ると思ってください。
rink

2019/12/07 10:05

受け取ること自体は出来るのですが、他のデータベースと同じidをもった者同士をつなげる方法が分かりません。 SQLインジェクション対策はまだ何もしていません。申し訳ございません。
m.ts10806

2019/12/07 10:22

ん。データベースが違う?テーブルが違うようにしか見えませんが。 要はcartテーブルにあるIDの商品名がとれればいいんですよね?
rink

2019/12/07 10:24 編集

そうです。。。テーブルが違うだけで、データベースは同じです。。 cartテーブルにある商品IDと同じIDを持った本の情報を、productテーブルから取り出したいです。
rink

2019/12/09 19:08

お二方とも、わかりやすい返信を、ありがとうございます。 テーブルの結合というものを知りませんでした。 大変勉強になりました。ありがとうございました!!!
guest

回答2

0

ベストアンサー

inner join
で検索。

テーブル同士を条件で結合して情報を取得するものです。

投稿2019/12/07 10:22

m.ts10806

総合スコア80875

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

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

rink

2019/12/09 19:07

返信が遅くなってしまい、大変申し訳ありません。 ありがとうございます! できました(´;ω;`) 本当に、いつもありがとうございます<(_ _)>
m.ts10806

2019/12/09 22:38

解決されたようで何よりです。 キーワードを如何に見つけるかが鍵だと思います。 ※あと回答者は基本急いでないので謝る必要はないです。 「できた」だけでなく、「どうやってできた」を書いてもらった方があとから見た人のためにもなりますので、むしろそこをしっかり書いてもらいたいところ
rink

2019/12/10 02:36

返信ありがとうございます! そうですね、書いたコードを載せようと思います!
guest

0

"SELECT * FROM cart LEFT OUTER JOIN product ON cart.product_id = product.product_id"
としたらうまくいきました!!

投稿2019/12/10 02:36

rink

総合スコア80

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

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

rink

2019/12/10 02:37

ご回答くださった方々、本当にありがとうございました!!!
m.ts10806

2019/12/10 02:43 編集

申し訳ないですが低評価しています。 left joinだとcartにあるproduct_idがproductテーブルになかったらproduct情報にNULLが入りますよ。productから名前とってきたと思ったら表示する名前がないということになります。 私は「inner join」とアドバイスしてます。 違いを調べてください。 本来は両テーブルを外部キー制約で繋ぐべきですけどね。
rink

2019/12/10 02:45

返信ありがとうございます。 Inner joinですか… 調べてみます!ありがとうございます!
m.ts10806

2019/12/10 02:53 編集

私回答に初めからinner書いてます。 それにleft joinは「データがなかったらnullで埋める」処理が発生するので速度的には遅いです。
rink

2019/12/10 03:56

返信ありがとうございます。 そうですよね、何も考えずにLeft joinを使ってしまっていました…
m.ts10806

2019/12/10 03:59

こちらも意図を伝えず丸投げ回答してしまったような形なので申し訳なかったです。(低評価は取り消しました) それぞれに使うべき場面はあるから機能がわかれているので、そのあたりを試して理解できたらこの自身の回答に追記して当件は完了としてもらえたらと。
rink

2019/12/10 05:00

返信ありがとうございます。 勉強して、Inner joinで実装出来たら載せます! こちらこそ申し訳ございませんでした。今回は、本当にありがとうございました!助かりました<(_ _)>
m.ts10806

2019/12/10 05:12

勉強して… というかleftをinnerに変えたらいいだけですよ。
rink

2019/12/10 05:16

返信ありがとうございます! あ、そうなんですか。。。InnerとLeftの違いをまだ理解できていないので、勉強します!!!
m.ts10806

2019/12/10 05:38

そうですね。違いくらいなら調べれば考え方はすぐ出てきますが、自身でデータ投入して確かめるのが最も理解に繋がります
rink

2019/12/10 06:26

返信ありがとうございます! そうですよね!頑張ります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問