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

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

詳細はこちら
MySQL

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

PHP

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

Q&A

解決済

2回答

1554閲覧

php mysql 掲示板の機能について

yuki911

総合スコア27

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/12/25 06:35

現在phpとmysqlで掲示板を製作しています
main.phpでタイトルを書き込み、タイトルをリンクとして表示させ、リンクをクリックすると関連したtolk.phpに飛ぶ仕組みを検討しています。
2つのテーブルを関連づけるのはJOINですることがわかりましたが、リンクを作り、ページに飛んだ後、全て同じ内容(tolk.php)になってしまっています。
リンクを作った後、それぞれ別の内容にするにはどのような記述をすればいいでしょうか?

今現在の状態です
テーブル名:boards
id:int(11)
title:varchar(255)
uptime:datetime
テーブル名:res
id:int(11)
res_time:datetime
message:text

main.php <?php // 部屋立て ini_set('display_errors', true); error_reporting(E_ALL); session_start(); require 'database.php'; $login = $_SESSION['login']; $error = []; if(filter_input(INPUT_SERVER,'REQUEST_METHOD') === 'POST'){ date_default_timezone_set('Asia/Tokyo'); $title = filter_input(INPUT_POST, 'title'); $uptime = date("Y-m-d H:i:s"); if($title === ''){ $error[] = 'タイトルは入力必須です。'; }else if(strlen($title) > 10){ $error[] = 'タイトルは10文字以内で入力してください。'; } if(count($error) === 0){ try{ $pdo = connect(); $stmt = $pdo->prepare('INSERT INTO boards (id,title,uptime) VALUES (null,?,?)'); $params = []; $params[] = $title; $params[] = $uptime; $stmt->execute($params); }catch(PDOException $e){ $error['login'] = 'データベースの接続に失敗しました。'; echo $e->getMessage(); } } } try{ $pdo = connect(); $stmt = $pdo->prepare('SELECT * FROM boards'); $stmt->execute(); $rows = $stmt->fetchAll(); }catch(PDOException $e){ $error['login'] = '一覧が表示されません。'; echo $e->getMessage(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <link rel="stylesheet" href="/css/styles.css"> <meta charset="utf-8"> <title>メインページ</title> <h1>掲示板へようこそ</h1> </head> <body> <?php if(count($error) > 0) : ?> <?php foreach($error as $e) : ?> <p><?php echo h($e); ?></p> <?php endforeach; ?> <?php endif; ?> <section> <h2>新規投稿</h2> <form action="" method="post"> <label for="title">タイトル</label><br> <input type="text" name="title" id="title"><br> <button type="submit">部屋を立てる</button> </form> </section> <section> <h2>投稿一覧</h2> <?php if(!empty($rows)): ?> <?php foreach($rows as $row): ?> <div class="linkbox"> <a href='tolk.php'> <!-- <?php echo h($login); ?> --> <?php echo h($row['title']); ?><br> <?php echo h($row['uptime']); ?> </a> </div> <?php endforeach; ?> </ul> <?php else: ?> <p>投稿はまだありません。</p> <?php endif; ?> </section> </body> </html>
res.php <?php // 部屋立て ini_set('display_errors', true); error_reporting(E_ALL); session_start(); require 'database.php'; $login = $_SESSION['login']; $error = []; if(filter_input(INPUT_SERVER,'REQUEST_METHOD') === 'POST'){ date_default_timezone_set('Asia/Tokyo'); $message = filter_input(INPUT_POST, 'message');//POST、入力された値を格納 $res_time = date("Y-m-d H:i:s"); if($message === ''){ $error[] = 'メッセージは入力必須です。'; }else if(strlen($message) > 100){ $error[] = 'メッセージは100文字以内で入力してください。'; } if(count($error) === 0){ try{ $pdo = connect(); $stmt = $pdo->prepare('INSERT INTO res (message,res_time) VALUES (?,?)'); $params = []; $params[] = $message; $params[] = $res_time; $stmt->execute($params); // $aaa = $stmt->fetchAll(); }catch(PDOException $e){ $error['login'] = 'データベースの接続に失敗しました。'; echo $e->getMessage(); } } } try{ $pdo = connect(); $stmt = $pdo->prepare('SELECT * FROM boards INNER JOIN res ON boards.id = res.id'); $stmt->execute(); $rows = $stmt->fetchAll(); }catch(PDOException $e){ $error['login'] = 'データベースの接続に失敗しました。'; echo $e->getMessage(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <link rel="stylesheet" href="/css/styles.css"> <meta charset="utf-8"> <title>メインページ</title> <h1>掲示板へようこそ</h1> </head> <body> <?php if(count($error) > 0) : ?> <?php foreach($error as $e) : ?> <p><?php echo h($e); ?></p> <?php endforeach; ?> <?php endif; ?> <section> <h2>新規投稿</h2> <form action="" method="post"> <label for="message">メッセージ</label><br> <input type="text" name="message" id="message"><br> <button type="submit">投稿</button> </form> </section> <section> <h2>投稿一覧</h2> <?php if(!empty($rows)): ?> <?php foreach($rows as $row): ?> <div class="linkbox"> <?php echo h($login); ?> <?php echo h($row['res_time']); ?><br> <?php echo h($row['message']); ?> </div> <?php endforeach; ?> </ul> <?php else: ?> <p>投稿はまだありません。</p> <?php endif; ?> </section> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

テーブルの設計がおかしいですね・・・

掲示板を表示する際のSELECT文が
SELECT * FROM boards INNER JOIN res ON boards.id = res.id
のようになっていますが、書き込みのINSERT文は
INSERT INTO res (message,res_time) VALUES (?,?)
のようになっており、res.idは自動採番のため、boards.idとは紐づいていないです。
そのため、現状のSELECT文だと、boardsテーブルのレコード件数分しか表示されないのではないでしょうか?

boardsテーブルとresテーブルを紐づけるために、resテーブルにboards_idのようなカラムを追加し、書き込み時にboards.idも一緒にinsertしてあげましょう。

insertするためのboards.idは、
tolk.php?boards_id=<?php echo $row['id']; ?>
のようにGetパラメータを付与することで、tolk.php側で、$_GET['boards_id']で取得できます。

表示する際は、$_GET['boards_id']で取得したidとres.boards_idが紐づくresテーブルのレコードをselectすればいいと思います。

投稿2019/12/27 02:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

tolk.phpに飛ばすところで、idとか固有な情報を引き渡す必要がありますね。
GET取得できるように「tolk.php?id=<?php echo $row['id']; ?>」みたいにするとか。
そうすることで、tolk.phpでは$_GET['id']として渡されてきたパラメータを受信できるため、
そのidに該当する表示をする処理を記述すればいいとなります。
例えば、where句にidを与えれば良いとか。

投稿2019/12/25 06:51

編集2019/12/27 01:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki911

2019/12/26 11:59

コメントありがとうごうございます。 tolk.phpにidを引き渡すのは理解できましたがtolk.phpの表示が全部一緒なのはどうすればいいでしょうか? id引き渡すとなれば内部結合する意味はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問