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

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

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

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

PHP

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

Q&A

解決済

2回答

477閲覧

【PHP】自作ブログ 各記事ページへのリンク【MySQL】

ceoyama7

総合スコア15

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/04/08 15:08

編集2019/04/08 15:19

##現状
現在、主にPHPで自作ブログを作成している初心者です。
データベースはMySQLを使用しています。
トップページのレイアウト(記事一覧)が完成し、子ページへリンクを繋げる作業中です。
トップページに記事の概要のようなものを複数表示し、
クリックで詳細記事ページに飛ぶようにしたいです。

DBの構造は
Blog-post-(no/title/category/content/time)としています。

##わからないこと
各記事のページについて、
まず、aタグにphpで順にリンクを指定すればいいのかと考えたのですが、
1、データベースの内容にURLがないので、どこへのリンクを貼ればいいのかわからない。

そこで、トップページから外枠だけできた詳細記事ページに飛び、
その中でDBから取得した内容を表示すればいいのか、と考えましたが、
2、トップページでクリックされたのがどの記事なのか判定する方法がわからない。

また、現在のコードを後述しますが、
index.phpからreqwireでt_index.phpへ飛んでますが、
理解半分のまま参考にしたサイトから引っ張ってきたコードな為、
3、single.php(記事詳細ページ)への繋げ方がわからない。

繋がっていないためか、single.phpでUndefined variable:postエラーが出てしまいます。

##試したこと
初心者なりに今日1日調べてみて、
urlencodeやsetIntなどの関数や、teratail自体にも過去に似たような質問を見つけたのですが、
結果、応用できなかったため質問させていただきました。

indexphp

1<?php 2 3//MySQLへ接続 4 $pdo = new PDO("mysql:host=localhost;dbname=blog", "abc", "abc"); 5 6//postテーブルを降順に取得 7 $st = $pdo->query("SELECT * FROM post ORDER BY no DESC"); 8 9//取得したpostデータを全て選択 10 $posts = $st->fetchAll(); 11 12 13//選択したpostデータの数だけ繰り返し処理 14 for ($i = 0; $i < count($posts); $i++) { 15 16 17//commentテーブルから各記事に対応するデータを降順に取得 18 $st = $pdo->query("SELECT * FROM comment WHERE post_no={$posts[$i]['no']} ORDER BY no DESC"); 19 20//コメントを全て選択 21 $posts[$i]['comments'] = $st->fetchAll(); 22 } 23 24//t_index.phpへ繋げる 25 require 't_index.php'; 26 27 28 29 30?> 31

tindexphp

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <title>Yama_Blog.</title> 5 <meta charaset="utf-8"> 6 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> 7 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> 8 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> 9 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> 10 11 <link rel="stylesheet" href="stylesheet.css"> 12 13</head> 14<body> 15 <header> 16 17 <nav 18 class="navbar navbar-expand-sm navbar-light mb-2" 19 style="background-color:#fff;"> 20 21 <a href="index.php" class="navbar-brand"> 22 <img src="image/logo.png" alt="logo"> 23 </a> 24 <button 25 class="navbar-toggler" 26 id="navbar-toggler" 27 type="button" 28 data-toggle="collapse" 29 data-target="#navmenu1" 30 aria-controls="navmenu1" 31 aria-expanded="false" 32 aria-label="Toggle navigation"> 33 <span class="navbar-toggler-icon"></span> 34 </button> 35 <div class="collapse navbar-collapse" id="navmenu1"> 36 <div class="navbar-nav"> 37 <a class="nav-item nav-link" href="profile.php">Profile</a> 38 <a class="nav-item nav-link" href="#">Portfolio</a> 39 <a class="nav-item nav-link" href="#">Contact</a> 40 </div> 41 </div> 42 </nav> 43 </header> 44 <div class="container" id="container"> 45 <div class="row"> 46 <div class="col-xs-12 col-md-12 col-lg-12" > 47<?php foreach ($posts as $post) { ?> 48 <a href="single.php" style="color:black;"> 49 <div class="article col-xs-12 col-md-4 col-lg-4"> 50 <p>最終更新日:<?php echo $post['time']; ?></p> 51 <h2><?php echo $post['title']; ?></h2> 52 <p>:<?php echo $post['category']; ?>:</p> 53 <img src="<?php echo $post['image']; ?>" alt="" class="img-fluid"> 54 <p><?php echo mb_substr(nl2br($post['content']),0,40,'utf-8',).'...'; ?></p> 55 </div> 56 </a> 57<?php } ?> 58 </div> 59 60 </div> 61 </div> 62 <footer> 63 <div class="footer-left"> 64 <img src="image/logo.png" alt="logo"> 65 </div> 66 </footer> 67 68 <script type="text/javascript" src="stylesheet.js"></script> 69 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 70</body> 71 72</html> 73

singlephp

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4... 5</head> 6<body> 7 <header> 8 ... 9 </header> 10 <div class="container" id="container"> 11 <div class="row"> 12 <div class="article col-xs-12 col-md-12" > 13 <p><?php echo nl2br($post['content']); ?></p> 14 </div> 15 16 </div> 17 </div> 18 <footer> 19 20 </footer> 21 22 <script type="text/javascript" src="stylesheet.js"></script> 23 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 24</body> 25 26</html> 27

ぐちゃぐちゃなコードであるかとは思いますが、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

追加で、

3、single.php(記事詳細ページ)への繋げ方がわからない。

繋がっていないためか、single.phpでUndefined variable:postエラーが出てしまいます。

こちらは、

php

1 <p><?php echo nl2br($post['content']); ?></p>

この部分で発生しているエラーですね。
Undefined variable:post はそのままの意味で、$post が未定義ですという意味になります。
代入などが行われていない変数を参照したというエラーです。

基本的なことになりますが、PHPなどのWebアプリでは、
リンクやフォームなどでページが遷移するたびに、全ての変数は初期化されます。
そのため、 single.php の前のページで$postを作っていても、
single.phpに遷移した時点で未定義となってしまっているということになります。

そこでどうするかというと、
mts10806さんが回答されているように
QueryStringなどを使って情報を遷移先に受け渡してやるということになります。


ここからは余談となりますが、
もし学習されるのであれば、個人的には、いきなり一から組み上げていくのではなく、
何かしら初心者向けの書籍を購入し写経していく(単にコードを移す)ところから始めることをおすすめします。
できるだけシンプルな構成の手本を元に、まずは確実に動くコードを組み上げ、
そこから少しずつ改造したりしながら理解していくというアプローチが一番つまずきづらいと思います。
(もし、今回の質問のコードが何かの書籍を参考にされたものであったならすみません…)

投稿2019/04/08 23:35

sansaisoba

総合スコア241

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

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

ceoyama7

2019/04/09 04:11

返答ありがとうございます! 恐らくpostが渡されてないんやろうなとは思ってたのですが、渡し方がわからず、今回QueryStringの存在を知れたことが進歩となりました。 自分でも、出来ることの範疇を超えて作ってるなとは思うのですが、ここまで来たら無理矢理にでもブログを作ってしまって、1から勉強し直した事を記録しておく備忘録的な使い方をしようと思ってます!
guest

0

コードあまり読んでませんが、「記事を特定」できればいいので、データベース上のキーとなる情報がリンクに含まれていれば良いですよね。

single.php?id=1234

のようにQuery String指定してsingle.phpで$_GET['id']で取得したidでDB問い合わせを行えば良いと思います。

teratailのリンクURLは参考になるかと。teratailはフレームワーク利用されているのでQuery StringというよりURL解析ですが考え方は同じです。
リンクURLにキーとなる情報を含ませる。

投稿2019/04/08 23:06

m.ts10806

総合スコア80850

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

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

ceoyama7

2019/04/09 03:47

本質的な回答がmts10806さんだったので、ベストアンサーにしようと思ったのですが誤タッチでベストアンサーにできずすみません、、 QueryString自体初見でした。 teratailのURLもteratailの、questionの、〇〇番目、みたいな意味なんですね! 確かに今までにもそんな感じのURLは見たことありました。 参考に組んでいこうと思います。 自分で調べるべきことではあるかとは思いますが、その場合single.phpにまず記事全体を表示し、idなりnoなりでフィルタリングして表示、みたいな流れですかね? 毎度ありがとうございます。
m.ts10806

2019/04/09 03:51

私がすすめるのは変ですが、仕組みとしてベストアンサーの解除はできます。 いずれにしても私は質問者さんのコードにほとんど触れずに回答していますので、 「今起きている問題の解決」という観点でsansaisobaさんの回答を参考にし、「ではどうするか」という観点で私の回答を参考にすれば良いと思います。 >その場合single.phpにまず記事全体を表示し、idなりnoなりでフィルタリングして表示、みたいな流れですかね? 記事全体を表示する必要はありませんよ。 $_GETでキーとなるパラメータを取得したらDBに対してWhere句で絞込をかけて1件だけ取得して1件だけ表示すれば良いです。 phpなのでサーバー側の処理です。画面描画は処理した後です。処理の時に表示したいデータだけとってくれば良いです。
m.ts10806

2019/04/09 03:53

あと、老婆心ですが、BootStrapやらなにやら入れられていますが、 こういう見た目部分の対応は最後で良いです。 まずは最低限のhtmlのみで対応するようにしてください。「ミニマムコードで動作検証」です。 見た目はあとからどうにでもなります。 でもプログラム部分は見た目に関係ありません。
ceoyama7

2019/04/09 04:16

あ、なるほど、先に見た目を作ってしまってプログラムを組み込むべきところに編入していく、みたいな流れでやってました。確かに見た目ごちゃごちゃ書いた後に組み込むと余計にややこしくなってましたね。考え方として訂正します。
m.ts10806

2019/04/09 04:23

できるだけ部品を作っていくようにすると良いです。 もちろんCSSフレームワークやJSプラグインなどを採用する場合はそのフレームワークやプラグインの法則にのせてhtmlを組む必要がありますがそれは「モック」として静的htmlを組んで置いておけば良い話、phpの処理部分とは切り離して行える部分です。
ceoyama7

2019/04/09 05:51

調べていて少し気になったので追加で質問させてください。 t_indexで選ばれた記事をsingleで表示する前提で質問しましたが、そこは無くしてもらって(t_indexを書き換えて表示的なことができて適正であるならそれでもいいです)、single.phpへはデータベースの情報が渡っていない現状ですが、QueryString(URLパラメータ?)を使って記事詳細を表示するにはデータベースの情報をsingle.phpに渡してから.../single.php/?no=1234みたいな処理をするという事でしょうか? single.phpに渡さなくてもt_index.php/?no=1234みたいな感じでt_indexの内容を書き換える、みたいな処理になりますでしょうか? 的外れな質問でしたらすみません。
m.ts10806

2019/04/09 05:56

t_index.phpで一覧のそれぞれのデータを出しているところを下記のように修正 <a href="single.php" style="color:black;"> ↓ <a href="single.php?no=<?php echo $post['post_no'] ?>" style="color:black;"> single.phpで下記のように取得して $post_no = filter_input(INPUT_GET,'no'); //$_GET['no'] と意味合いはほぼ同等です SQLを実行 SELECT * FROM comment WHERE post_no=$post_no ORDER BY no DESC
m.ts10806

2019/04/09 05:57

ちなみに.php/?no=1234 のように/を挟んでしまうとディレクトリが変わってしまいます。 必ず.php?no=1234 と渡したいプログラムに直”?”を続けてください
ceoyama7

2019/04/09 06:11 編集

singleで表示する場合、index.phpをsingle内でincludeすればいいのかな、と思っています。 (コメント見ないで続けてしまいました、無視してください。再度ご返答ありがとうございます!)
m.ts10806

2019/04/09 06:11

comment じゃなくてpostでしたね。失礼。 SQLはこう。 SELECT * FROM post WHERE post_no=$post_no > index.phpをsingle内でincludeすればいいのかな、 表示に不要なデータ全てを取得するのは無駄です。別途取得用の処理を作ってください。 しいてなら、selectのSQLを実行する部分を検索条件有無でwhere有無を切り分けて共通化するくらいですが、もう少し先の話。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問