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

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

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

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

PHP

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

Q&A

解決済

3回答

210閲覧

[PHP]掲示板のように投稿した内容を表示したい[MySQL]

toki38

総合スコア14

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/07/01 09:40

前提・実現したいこと

PHPとmySQLで掲示板のようなものを作成途中です。投稿ページ(post.php)から投稿された内容をDBへ格納し、home.phpで投稿された内容をそれぞれ繰り返し表示したいです。 DBにはきちんと格納されています。

発生している問題・エラーメッセージ

下記コードだと最新の投稿内容だけが繰り返し表示されてしまいます。どのように書けばすべての投稿内容を表示することができるでしょうか。なにぶんPHP初学者でして、ご助言頂けると助かります。

該当のソースコード

(home.php): <?php session_start(); include_once('dbconnect.php');//DB接続 //usersテーブルとpostsテーブルをリレーションさせる $query = "SELECT * from posts LEFT JOIN users ON posts.post_id = users.user_id"; $result = $mysqli->query($query); //ポスト情報の取り出し $posteds = $result;//ここらへんがわからないです while ($row = $result->fetch_assoc()) { $username = $row['username']; $photo = $row['photo']; $post_name = $row['post_name']; $post_author = $row['post_author']; $post_introduction = $row['post_introduction']; $post_image = $row['post_image']; } ?> <!doctype html> <html lang="ja"> <head> ~~~省略(Bootstrap使ってます)~~~ </head> <body> <div class="text-center text-white"> <a href="post.php" class="btn btn-lg btn-success"><span><i class="fas fa-book-open"></i></span> 投稿ページへ</a> </div> <div class="post-wrapper pt-5"> <div class="container"> <div class="row"> <!-- 繰り返し表示したい箇所 --> <?php foreach ($posteds as $posted): ?> <div class="col-md-4 text-center mb-3"> <img src="<?php echo $post_image; ?>" width="200px" height="300px"> </div> <div class="col-md-8 mb-3"> <h3><?php echo $post_name; ?></h3> <p><?php echo $post_author; ?></p> <p><?php echo $post_introduction; ?></p> </div> <div class="col-md-4 text-center mb-3"> <img src="<?php echo $photo; ?>" width="120px" height="120px" class="rounded-circle"> <p>紹介者 : <?php echo $username; ?>さん</p> </div> <div class="col-12"> <hr style="background-color:#EB6964" class="mb-5" > </div> <?php endforeach; ?> <!-- ここまで繰り返し --> </div> </div> </div> </body> </html>
(post.php): <?php session_start(); include_once('dbconnect.php'); //DB接続 //投稿ボタンを押したときの処理 if (isset($_POST['posting'])) { $post_name = $mysqli->real_escape_string($_POST['post_name']); $post_author = $mysqli->real_escape_string($_POST['post_author']); $post_introduction = $mysqli->real_escape_string($_POST['post_introduction']); $post_image = "bookimage/".$_FILES['post_image']['name']; //uses_idをpost_idに代入 $query2 = "SELECT user_id FROM users WHERE user_id=".$_SESSION['user'].""; $result = $mysqli->query($query2); while ($row = $result->fetch_assoc()) { $post_id = $row['user_id']; } //POSTされた情報をDBへ格納する $query = "INSERT INTO posts SET post_name=?, post_author=?, post_introduction=?, post_image=?, post_id=?"; $stmt = $mysqli->prepare($query); $stmt->bind_param("ssssi", $post_name, $post_author, $post_introduction, $post_image, $post_id); $stmt->execute(); move_uploaded_file($_FILES['post_image']['tmp_name'], $post_image); } ?> <!doctype html> <html lang="ja"> <head> ~~~省略(Bootstrap使ってます)~~~ </head> <body> <div class="post-wrapper pt-5"> <div class="container"> <div class="row"> <div class="col-md-6 offset-md-3 text-center"> <h2>投稿画面</h2> <form method="post" enctype="multipart/form-data"> <label class="col-form-label">タイトル <span class="bg-danger text-white p-1" >必須</span></label> <input type="text" name="post_name" class="form-control" placeholder="例) ちはやふる" required/> <label class="col-form-label">作者</label> <input type="text" name="post_author" class="form-control" placeholder="例) 末次 由紀"> <label class="col-form-label">画像 <span class="bg-danger text-white p-1" >必須</span></label> <input type="file" name="post_image" class="form-control" required/> <label for="exampleTextarea">紹介文</label> <textarea name="post_introduction" class="form-control" placeholder="例) 最高に面白いです!" rows="8" cols="80"></textarea> <div class="text-center"> <input type="submit" name="posting" class="btn btn-lg btn-success mt-4" value="投稿する"> <a href="home.php">戻る</a> </div> </form> </div> </div> </div> </div> </body> </html>

補足情報

DBにはusersテーブルとpostsテーブルを作成しています。
・usersテーブル
user_id(AI), username, email, password, photo
・postsテーブル
id(AI), post_name, post_author, post_introduction, post_image, post_id

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

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

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

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

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

guest

回答3

0

SELECTした複数行の結果を取り出す場合、それを受け取る変数$postedsも配列にしてください。

php

1<?php 2// $posteds = $result; 3// while ($row = $result->fetch_assoc()) { 4// $username = $row['username']; 5// $photo = $row['photo']; 6// $post_name = $row['post_name']; 7// $post_author = $row['post_author']; 8// $post_introduction = $row['post_introduction']; 9// $post_image = $row['post_image']; 10// } 11 12// 結果を受け取る変数を配列にしてください 13$posteds = []; 14 15while ($row = $result->fetch_assoc()) { 16 // 配列に取り出した一行分の結果を足していく 17 $posteds[] = $row; 18}

php

1 <!-- 繰り返し表示したい箇所 --> 2 <?php foreach ($posteds as $posted): ?> 3 <div class="col-md-4 text-center mb-3"> 4 <img src="<?php echo $posted['post_image']; ?>" width="200px" height="300px"> 5 </div> 6 <div class="col-md-8 mb-3"> 7 <h3><?php echo $posted['post_name']; ?></h3> 8 <p><?php echo $posted['post_author']; ?></p> 9 <p><?php echo $posted['post_introduction']; ?></p> 10 </div> 11 <div class="col-md-4 text-center mb-3"> 12 <img src="<?php echo $posted['photo']; ?>" width="120px" height="120px" class="rounded-circle"> 13 <p>紹介者 : <?php echo $posted['username']; ?>さん</p> 14 </div> 15 <div class="col-12"> 16 <hr style="background-color:#EB6964" class="mb-5" > 17 </div> 18 <?php endforeach; ?> 19 <!-- ここまで繰り返し -->

投稿2019/07/03 02:58

hideki_nakajima

総合スコア44

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

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

0

自己解決

home.phpを下記のように書き換えて上手くいきました。
whileで定義していた部分をhtml部分に直接書くことで実装できました。
回答者さんの回答がヒントになりました。ありがとうございます。

(home.php): <?php session_start(); include_once('dbconnect.php');//DB接続 //usersテーブルとpostsテーブルをリレーションさせる $query = "SELECT * from posts LEFT JOIN users ON posts.post_id = users.user_id"; $result = $mysqli->query($query); ?> <!doctype html> <html lang="ja"> <head> ~~~省略(Bootstrap使ってます)~~~ </head> <body> <div class="text-center text-white"> <a href="post.php" class="btn btn-lg btn-success"><span><i class="fas fa-book-open"></i></span> 投稿ページへ</a> </div> <div class="post-wrapper pt-5"> <div class="container"> <div class="row"> <!-- 繰り返し表示したい箇所 --> <?php while ($row = $result->fetch_assoc()): ?> <div class="col-md-4 text-center mb-3"> <img src="<?php echo $row['post_image']; ?>" width="200px" height="300px"> </div> <div class="col-md-8 mb-3"> <h3><?php echo $row['post_name']; ?></h3> <p><?php echo $row['post_author']; ?></p> <p><?php echo $row['post_introduction']; ?></p> </div> <div class="col-md-4 text-center mb-3"> <img src="<?php echo $row['photo']; ?>" width="120px" height="120px" class="rounded-circle"> <p>紹介者 : <?php echo $row['username']; ?>さん</p> </div> <div class="col-12"> <hr style="background-color:#EB6964" class="mb-5" > </div> <?php endwhile; ?> <!-- ここまで繰り返し --> </div> </div> </div> </body> </html>

投稿2019/07/03 01:57

toki38

総合スコア14

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

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

hideki_nakajima

2019/07/03 03:02

ビュー(表示部分) とロジック (プログラムの処理部分) を混在させる書き方はおすすめできません。 先に配列に結果を全て格納する方法を検討してください。
toki38

2019/07/03 08:04

ご回答ありがとうございます。 回答いただいたコードで書き直したところ上手く作動しましたので変更しました。 ご助言感謝いたします。
guest

0

while ($row = $result->fetch_assoc()) { $username = $row['username']; $photo = $row['photo']; $post_name = $row['post_name']; $post_author = $row['post_author']; $post_introduction = $row['post_introduction']; $post_image = $row['post_image']; }

この部分で、ループ1回目で全部書き込まれて、ループ最後のデータで全て上書きされます。
ループ1回目
$a = 11
$b = 12
ループ2回目
$a = 21
$b = 22
って感じなので最後に見た時、$aと$bの中身は何? って言うと21と22になります。
(最新のデータが格納されている)

それぞれを変数に格納しないでforeachとかで取り出した値を
そのまま表示させるのが一番簡単かなぁと思います。

投稿2019/07/02 02:45

expy

総合スコア103

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

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

toki38

2019/07/02 04:31

ご回答ありがとうございます。 >それぞれを変数に格納しないでforeachとかで取り出した値を そのまま表示させるのが一番簡単かなぁと思います。 いろいろ書いてみたのですが、うまくいかず... うまくいくコードを書いて頂けると助かります。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問