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

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

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

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

PHP

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

Q&A

解決済

3回答

2085閲覧

【ループの記述で困っています】データベースの値の取得方法について

ssk

総合スコア332

MySQL

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

PHP

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

0グッド

0クリップ

投稿2015/08/25 04:48

練習のために、返信機能付きの掲示板を作っています。
なんとか、データベースから欲しい情報を取得できたのですが、その値を表示する方法で困っています。

【やりたいこと】
各投稿に対する返信(コメント)を各投稿の下に複数表示させたいです。

【現状】
返信(コメント)の数だけしか、投稿が反映されていません。。
つまり、データベースに投稿(8件)返信(コメント5件)あるのに、投稿一覧を表示するとコメント5件分のみの投稿が表示されています。

このような形になっています。

while(true){ //1行ずつ取り出し $rec = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($rec); if($rec==false){ break; } $slug=$rec['slug']; $post_id=$rec['post_id']; $code=$rec['code']; $user_name=$rec['user_name']; $comment_user_name=$rec['comment_user_name']; $comment=$rec['comment']; $profile_image=$rec['profile_image']; $resize_image=$rec['resize_image']; $weekday_or_holiday=$rec['weekday_or_holiday']; $picture_time=$rec['picture_time']; $contents=$rec['contents']; //投稿ここから echo '<p><span class="profile_image></span><span class="user_name">'.$user_name.'</span><span class="date_time">-'.$weekday_or_holiday.''.$picture_time.'時頃</span></p>'; echo '<figure class="col span_3 thumbnails"></figure>'; echo '<figcaption class="col span_9">'.$contents.'</figcaption>'; //投稿に対するコメント表示 echo '<p><span>'.$comment_user_name.'<span></p>'; echo '<p class="comment">'.$comment.'</p>'; //コメントに対するリアクション入力ここから echo '<form method="post" action="#" accept-charset="UTF-8">'; echo '<input type="hidden" name="post_id" value="'.$post_id.'"><input type="hidden" name="code" value="'.$code.'">'; echo '<input type="hidden" name="slug" value="'.$slug.'">'; echo '<textarea type="text" name="comment"></textarea>'; echo '<input type="submit" value="内容を確認">'; echo '</form>'; echo '<div style="clear:both;"></div>'; }

どう、ループを記述すれば各投稿の下に返信(コメント)が複数並ぶようになるでしょうか?><

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

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

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

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

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

guest

回答3

0

ベストアンサー

LEFT JOIN にしても5件しか取れないのは
WHEREでcomment.slugに値が設定されているデータに限定しているせいだと思います
コメントが存在しないデータも取得するのでcomment.slugがNULLの場合も考慮してください

SQL

1SELECT 2 * 3FROM ( 4 SELECT 5 * 6 FROM post 7 INNER JOIN user 8 ON post.code = user.code 9) P 10LEFT JOIN ( 11 SELECT 12 * 13 FROM comment 14 INNER JOIN user 15 ON comment.code = user.code 16) C 17ON P.post_id = C.post_id 18WHERE P.slug=? 19AND (C.slug=? OR C.slug IS NULL) 20

投稿2015/08/25 05:53

編集2015/08/25 05:55
kutsulog

総合スコア985

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

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

ssk

2015/08/25 06:13

ありがとうございます。 SQL文をかじったばかりなので、勉強になります。 各投稿の下に返信(コメント)を複数表示するには、javaが必要のようなので、javaも勉強しようと思います。1行ずつ取得するため、投稿とコメントがセットで1件ずつ表示されるのですね><
anonymouskawa

2015/08/25 06:17

いえいえ!javaでなければ実装できないということではないです。 自分が作った時はjavaで行ったというだけですので、PHPでもRoRでもなんでも作れます。 頑張ってください。
ssk

2015/08/25 06:21

すいません><勘違いをしていました。
ssk

2015/08/25 06:34

kutsulogさん、調べたのですが、わかりませんでした。。 質問させて下さい。 ()P ()C のP、Cはどういう意味でしょうか?
kutsulog

2015/08/25 06:54

postテーブルに対してuserテーブルを結合した中間テーブルと commenntテーブルに対してuserテーブルを結合した中間テーブルの別名です。 userテーブルに対してuser2と別名を付けたのと同じ機能です。
ssk

2015/08/25 07:57

kutsulogさん、ありがとうございます。 理解できました。
ssk

2015/08/25 08:18 編集

NULLの情報も取得することができました。 現時点では 1件目:A記事+コメント 2件目:A記事+コメント 3件目:B記事+コメント となっています。 これを 1件目:A記事+コメント+コメント 2件目:B記事+コメント とするにはSQL文を変えるのでしょうか?><
kutsulog

2015/08/25 09:06

$before_post = -1 while(true){ // 結果取得 // 前のレコードの記事IDと違う場合のみ記事を表示 if($before_post != $post_id){ // 記事表示 // 記事IDを記録 $before_pos = $post_id } // コメントがあればコメント表示 if ($comment != ""){ // コメント表示 } } ざっくりとしたイメージですけど こんな感じでできませんか?
ssk

2015/08/25 11:13 編集

もう少しでできそうなんですが>< 記述はあっていますでしょうか?? 今もこの状態です。 1件目:A記事+コメント 2件目:A記事+コメント 3件目:B記事+コメント while(true){ //1行ずつ取り出し $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec==false){ break; } //結果取得 $before_post = -1; if($before_post != $post_id){ echo '<p><span class="user_name">'.$user_name.'</span></p>'; echo '<figcaption class="col span_9">'.$contents.'</figcaption>'; //コメントに対するリアクション表示 $before_post = $post_id; if ($comment != ""){ echo '<p><span>'.$comment_user_name.'<span></p>'; echo '<p class="comment">'.$comment.'</p>'; } }
ssk

2015/08/25 12:10

できました!! anonymouskawaさん、kutsulogさん、hy3さん 本当にありがとうございました>< 以下、コードです。 $before_post = -1; while(true){ //1行ずつ取り出し $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec==false){ break; } //結果取得 if($before_post != $post_id){ echo '<p><span class="user_name">'.$user_name.'</span></p>'; echo '<figcaption class="col span_9">'.$contents.'</figcaption>'; //コメントに対するリアクション表示 $before_post = $post_id; if ($comment != ""){ echo '<p><span>'.$comment_user_name.'<span></p>'; echo '<p class="comment">'.$comment.'</p>'; } }
guest

0

SQL

1SELECT * 2FROM post 3INNER JOIN USER ON post.code = user.code 4LEFT OUTER JOIN COMMENT ON post.post_id = comment.post_id 5LEFT OUTER JOIN USER user2 ON comment.code = user2.code 6WHERE...(以下略

LEFT OUTER JOINするのは、commentテーブルに結合しているuserテーブルもLEFT OUTER JOINにしないとダメですよ

投稿2015/08/25 05:43

anonymouskawa

総合スコア856

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

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

ssk

2015/08/25 06:07

ありがとうございます。 userテーブルもLEFT OUTER JOINにしてみました。 先程のコメントに対する返信もありがとうございます>< どうしても最後まで実装したいので、javaも勉強したいと思います。
guest

0

ループの書き方としてはきちんと全件をfetchするようになっているので、発行したSQL文の問題です。
恐らくは投稿を記録するテーブルとコメントを記録するテーブルを内部結合するようなSQLになっているのではないでしょうか。

投稿テーブルに対してコメントテーブルをLEFT JOINするようなSQLに直せば良いと思います。

投稿2015/08/25 04:56

hy3

総合スコア594

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

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

ssk

2015/08/25 05:19 編集

早速、ありがとうございます。 以下のSQL文なのですが、INNER JOINをLEFT JOINにするとよいのでしょうか?? SELECT * FROM post INNER JOIN user ON post.code = user.code INNER JOIN comment ON post.post_id = comment.post_id INNER JOIN user user2 ON comment.code = user2.code WHERE post.slug=? AND comment.slug=?
ssk

2015/08/25 05:20

INNER JOINをLEFT JOIN に変更したのですが、同じように5件のみ表示されています><
ssk

2015/08/25 05:22

テーブルはこのような形になっています。 user(テーブル名) -code -user_name -mail -password post(テーブル名) -post_id -code -slug -contents comment(テーブル名) -post_id -code -slug -comment
hy3

2015/08/25 05:59 編集

userテーブルもあるのですね。 anonymouskawaさんがおっしゃっている通り、LEFT JOINへの変更はpostテーブルとcommentテーブルの間だけでは不十分です。 解決しないようであれば、変更後のSQLをもう一度貼ってみていただけると更にアドバイスできると思います。 (追伸) 恐らく、kutsulogさんの指摘が正解ですね!
ssk

2015/08/25 06:05

ありがとうございます>< ただ、PHPだけだと僕のやりたいことは難しいのですね。 anonymouskawaさんがおっしゃっていたのですが、各投稿に対するコメントを複数表示するとなるとjavaが必要のようです。
ssk

2015/08/25 06:21

(追伸) 勘違いをしていました。PHPでもできるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問